如何使用指针在 C 中的第一个空格上拆分字符串?



我正在尝试编写一个程序,允许用户输入他的全名,然后程序只输出他的全名。为此,我制作了一个指针,将 malloc 的大小定为 128 个字符,应该稍后存储名称。

我尝试使用CLion,Netbeans,Code Blocks运行该程序,现在在这个站点上,但是他们指出了一些错误...所以程序无法运行。

问题是程序甚至没有编译,说有一些错误......这些是构建消息:

|=== Build: Debug in exerciseSixteen (compiler: GNU GCC Compiler) ===|
| LINE | MESSAGE 
|      |In function 'getSurname':
|  08  |warning: initialization makes integer from pointer without a cast [-Wint-conversion]
|      |In function 'main':
|  04  |error: expected ')' before numeric constant
|  17  |note: in expansion of macro 'MAX'
|  21  |warning: format '%s' expects argument of type 'char *', but argument 2 has type 'int' [-Wformat=]|
|=== Build failed: 1 error(s), 2 warning(s) (0 minute(s), 0 second(s)) ===|

我什至卸载了 MinGW 编译器和 MSyS,并重新安装了也安装了 MinGW togheter 的代码块,但现在我知道我的问题与编译器或 IDE 无关......顺便说一下,这可能是代码,如下所示:

#include <stdio.h>
#include <stdlib.h>
#define MAX 128
char *getSurname(char *name)
{
char space = " ";
while (*name!=space) {
name++;
}
return name;
}
int main()
{
char *name = malloc(sizeof(char*MAX));
printf("Insert your full name: ");
gets(name);
char surname = *getSurname(name);
printf("Hello %s!n", surname);
return 0;
}

我看不到这段代码上有任何错误,我坚持一切正常......我错过了什么?我能做些什么来看到它工作?

嗯,有几个错误:

  1. malloc(sizeof(char*MAX)应该是malloc(sizeof(char) * MAX).
  2. gets()永远不应该使用,请使用fgets(name, MAX, stdin)
  3. char space = " ";错了,它应该是char space = ' ';的,因为" "是一个字符串,而不是一个字符。
  4. char surname = *getSurname(&name)在两个方面也是错误的:第一,你不需要使用*,你必须声明surnamechar *,而不是char;第二,你也不需要使用&name。正确的调用是char *surname = getSurname(name);
  5. 您还必须在扫描name时检查'',以避免超出字符串的末尾。
  6. 你停在while的空间,你应该再往前走一个字符,添加一个name++,然后返回,以防找到空间。
  7. 你应该检查malloc()的返回值,如果返回NULL,则退出程序。
  8. 从主菜返回之前free(name)是一种很好的做法,尽管这不是严格需要的。

正确的代码是:

#include <stdio.h>
#include <stdlib.h>
#define MAX 128
char *getSurname(char *name)
{
while (*name != '' && *name != ' ')
name++;
if (*name == ' ')
name++;
return name;
}
int main(void)
{
char *name = malloc(sizeof(char) * MAX);
if (name == NULL) {
perror("malloc() failed");
return 1;
}
printf("Insert your full name: ");
fgets(name, MAX, stdin);
char *surname = getSurname(name);
printf("Hello %s!n", surname);
free(name);
return 0;
}

此外,作为旁注,fgets()在第一个换行符处停止,因此您应该在处理之前从名称中删除换行符,否则您将获得如下输出:

Hello Relbeits
!

您可以在调用fgets()后执行此操作:

char *nl = strchr(name, 'n');
if (nl != NULL)
*nl = '';

in getSurname function

char space = ' ';

" "是字符串,不是字符。 需要可变类型字符*

在主函数中

char *name = (char*)malloc(sizeof(char) * MAX);

括号对不匹配

大小参数问题

char *surname = getSurname(name);

getSurname 函数不是指针函数。

getSurname 函数返回类型是字符指针。

参数类型为 getSurname 函数的字符* 参数 &name 是字符类型**

有几个错误。我在下面注释并修复了它们。我认为这样看会更容易。

#include <stdio.h>
#include <stdlib.h>
#if 1
#include <string.h>
#endif
#define MAX 128
char *
getSurname(char *name)
{
// NOTE/BUG: initialization of a _scalar_ must use single quotes
#if 0
char space = " ";
#else
char space = ' ';
#endif
// NOTE/BUG: this has no check for end of string
// NOTE/BUG: this returns a pointer to the _space_ and _not_ the first char
// of the last name
#if 0
while (*name != space) {
name++;
}
#else
for (;  *name != 0;  ++name) {
if (*name == space) {
++name;
break;
}
}
#endif
return name;
}
int
main(void)
{
// NOTE/BUG: this is a syntax error [not enough right paren]
#if 0
char *name = malloc(sizeof(char *MAX);
#else
char *name = malloc(sizeof(*name) * MAX);
#endif
// NOTE/BUG: do _not_ use 'gets'
printf("Insert your full name: ");
#if 0
gets(name);
#else
fgets(name,MAX,stdin);
char *cp = strchr(name,'n');
if (cp != NULL)
*cp = 0;
#endif
// NOTE/BUG: you want the address value of what name _points to_ and _not_
// the address of name itself
// NOTE/BUG: you want to return and save a _pointer_ and _not_ a scalar
#if 0
char surname = *getSurname(&name);
#else
char *surname = getSurname(name);
#endif
printf("Hello %s!n", surname);
return 0;
}

相关内容

  • 没有找到相关文章

最新更新