带有空格的字符串上的scanf问题

时间:2013-09-27 20:13:49

标签: c scanf

我在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 :(

5 个答案:

答案 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)

夫妻问题

  1. 错误scanf()格式ss不是格式说明符的一部分。 %[]格式说明符以]结尾。

  2. 错误的scanf()参数&myName。不要传递&myName的{​​{1}}地址,而只需使用char (*)[50]。这将传递myName的第一个元素的地址myNamechar *的预期匹配类型。

  3. 使用

    %[]

    进一步建议使用前导空格并限制文本读取。 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);