scanf如何处理空白区域?

时间:2012-03-31 17:17:15

标签: c string

我是Cstring的新手,很抱歉提出愚蠢的问题,请帮助。

char string[10];

printf("Give me your last name:\n");
scanf ("%s", string);                   //if i type 123 123
printf("Original string:%s\n", string);  //it shows 123

比较:

char string[] = "123 123";

printf("Original string:%s\n", string);  //it shows 123 123

6 个答案:

答案 0 :(得分:6)

问题是scanf。当您使用带有%s的scanf时,它会一直读取,直到它到达空格。 要阅读整行,您可以考虑使用fgets()

答案 1 :(得分:5)

scanf将空格视为字符串的结尾 因此,一旦遇到space字符,它就会停止阅读。

如果是c样式数组\0被认为是数组的结尾 初始化时,

char string[] = "123 123";

在第7个字符\0的末尾隐式添加3,它标记了此数组的结尾。

答案 2 :(得分:2)

这是正确的行为。默认情况下,scanf读取字符串,直到它到达空格。

来自scanf联机帮助页:

  

取值
   匹配一系列非空白字符;    下一个指针必须是一个足够长的字符数组的指针    保持输入序列和终止    空字符('\ 0'),自动添加。    输入字符串在空格或最大字段宽度处停止,    以先到者为准。

答案 3 :(得分:1)

由于scanf()的工作方式,您在此处看到了什么。您可以打印内部任何字符的字符串(无论它是否为空格)。 scanf()只要遇到空格就会停止,因为它会考虑这个变量"完成"。

答案 4 :(得分:1)

scanf扫描字符串直到任何空格。如果您需要阅读换行符,请使用fgets()

char string[64];
fgets(string, sizeof(string), stdin);

printf("%s", string); // should now contain any whitespace in the string.

答案 5 :(得分:0)

有时gets()还会创建一些警告。如果您决定使用scanf(),则可以像scanf("%[^\n]", character_array_variable);

一样使用它
#include<stdio.h>
#include<string.h>

void main()
{
    char FullName[20];

    scanf("%[^\n]s",FullName);

    printf("%s",FullName);
}

输出图像:
The output image