我正在尝试编写一个程序,允许用户输入他的全名,然后程序只输出他的全名。为此,我制作了一个指针,将 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;
}
我看不到这段代码上有任何错误,我坚持一切正常......我错过了什么?我能做些什么来看到它工作?
嗯,有几个错误:
malloc(sizeof(char*MAX)
应该是malloc(sizeof(char) * MAX)
.gets()
永远不应该使用,请使用fgets(name, MAX, stdin)
。char space = " ";
错了,它应该是char space = ' ';
的,因为" "
是一个字符串,而不是一个字符。char surname = *getSurname(&name)
在两个方面也是错误的:第一,你不需要使用*
,你必须声明surname
为char *
,而不是char
;第二,你也不需要使用&name
。正确的调用是char *surname = getSurname(name);
。- 您还必须在扫描
name
时检查' '
,以避免超出字符串的末尾。 - 你停在
while
的空间,你应该再往前走一个字符,添加一个name++
,然后返回,以防找到空间。 - 你应该检查
malloc()
的返回值,如果返回NULL
,则退出程序。
在 - 从主菜返回之前
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;
}