我在C中有这个简单的代码来扫描和打印带有空格的字符串:
#include <stdio.h>
#include <string.h>
int main()
{
char myName[50];
printf("Enter your name: ");
scanf("%[^\n]s", &myName);
printf("Your name is: %s", myName);
return 0;
}
编译器(gcc,我的mac上随Xcode附带的命令行工具的一部分)返回此错误:
name.c: In function ‘main’:
name.c:7: warning: format ‘%[^
’ expects type ‘char *’, but argument 2 has type ‘char (*)[50]’
name.c:7: warning: format ‘%[^
’ expects type ‘char *’, but argument 2 has type ‘char (*)[50]’
这里有什么问题?
注意:我需要使用scanf。对我来说没有fgets :(
答案 0 :(得分:4)
您应该传递scanf
char*
类型的%[^\n]s
参数(格式char myName[50];
scanf("%[^\n]s", &myName);
期望如此),但在您的代码中:
myName
您传递了char (*)[50]
数组的地址(即scanf("%[^\n]", myName);
)。您应该将其更改为:
scanf("%[^\n]", &myName[0]);
或:
{{1}}
答案 1 :(得分:2)
夫妻问题
错误scanf()
格式s
。 s
是不是格式说明符的一部分。 %[]
格式说明符以]
结尾。
错误的scanf()
参数&myName
。不要传递&myName
的{{1}}地址,而只需使用char (*)[50]
。这将传递myName
的第一个元素的地址myName
,char *
的预期匹配类型。
使用
%[]
进一步建议使用前导空格并限制文本读取。 scanf("%[^\n]", myName);
将输入限制为49个字符,为终止49
留下1个字节。
\0
答案 2 :(得分:2)
这里有什么问题?
嗯,这是:
format expects type ‘char *’, but argument has type ‘char (*)[50]’
指向数组的指针与指向数组第一个元素的指针不同。你应该摆脱那个&
运营商。
答案 3 :(得分:1)
在C中,myName
(当传递给函数时)衰减到指向数组的第一个元素(myname
)的指针。 &myName
是指向数组myname
的指针。 &myName[0]
将是指向第一个字符的指针,这是正确的,但看起来你是随机尝试的东西,直到你偶然发现了有效的东西。
答案 4 :(得分:0)
您的问题是您将地址传递给字符串开头的指针,而不是指向字符串的指针。只需删除&
。
scanf("%[^\n]", myName);