在scanf()格式的string中,尾随空白的效果是什么?

这段代码中scanf("%d")scanf("%d ")之间有什么区别,区别在于格式化string中的尾部空格?

 #include <stdio.h> int main(void) { int i, j; printf("enter a value for j "); scanf("%d ",&j); printf("j is %d\n", j); printf("enter a value for i "); scanf("%d", &i); printf("i is %d\n", i); return 0; } 

scanf()函数在scanf("%d ", &j);这样的格式说明符之后加空格的时候实际上是如何工作的scanf("%d ", &j);

scanf格式的空白字符会使其显式读取并忽略尽可能多的空白字符。 因此,在scanf("%d ", ...读取一个数字后,它将继续读取字符,丢弃所有的空白字符,直到它看到input中的非空白字符,该非空白字符将作为下一个字符被input函数读取。

用你的代码:

 printf("enter a value for j "); scanf("%d ",&j); printf("j is %d \n", j); 

它会打印第一行,然后等待你input一个数字,然后继续等待数字后面的内容。 所以,如果你只input5 Enter ,它会显示为挂起 – 你需要input另外一行,其上有一些非空白字符才能继续。 如果你input6 Enter ,那么它将成为i的值,所以你的屏幕看起来像这样:

 enter a value for j 5 6 j is 5 enter a value for ii is 6 

此外,由于大多数scanf%转换也会跳过前导空格(除%c%[%n之外的所有内容),%-conversions 之前的空格是不相关的( "%d"" %d"作用相同)。 所以大多数情况下,除非你知道你特别需要它们的特殊效果,否则你应该避免在scanf转换中使用空格。

格式string中的空白字符(空格,换行符,水平和垂直制表符)与input中的任意数量的空格字符匹配。
在你的第一个案件

  scanf("%d ",&j); 

当它遇到空白字符(WSC) ' '它会吃掉用户input的所有空格,包括按回车键 \n ,它将会进入一个非WSC。 在这种情况下,您的程序将通过按Ctrl + Z来终止。

scanf格式的空格字符与isspace所描述的任意数量的空格字符相匹配。 所以,如果你有空格,换行符,制表符或任何其他空白字符,那么在它返回之前它也将被scanf

差异(虽然很明显)是一个不同的格式string。 如果您input以下行:

"3 "

scanf()将成功返回。 否则,这取决于您提供的input。 scanf()基本上跳过空格(制表符,空格,换行符),并searchinputstream中的字母数字值。 由于这是尾随的空格,所以当按ENTER键时,它会在input的末尾与尾随的换行符混在一起,因此没有多大意义。

scanf()期望提供的input与您提供给它的格式string完全匹配,除了连续的空白字符被压缩为单个空格字符。 如果你想用它的string处理等价的sscanf()来parsing大数据串,这就变得非常重要。

进一步testing这个很好的练习会是这样的:

 #include<stdio.h> int main(void) { int a=0,b=0,c=0; printf("Enter values for A, B, C, in the format: \"AB - C\"\n"); scanf("%d %d - %d", &a, &b, &c); printf("Values: A:%d, B:%d, C:%d\n", a, b, c); } 

之后,在提供正确和不正确格式的安慰input(即:空格和连字符)之后,检查并查看这些整数的值。 这里有几个例子运行。 第一次使用不正确的input,第二次使用格式正确的input。 请注意,在第一种情况下, C甚至没有设置,因为如果input和格式string不匹配, scanf()将提供意外的行为。 一般来说,最好使用类似fgets()的方法从用户那里获得一个inputstring,然后使用各种search函数(即:strstr(),strch(),strcat,strcpy等)来parsing你的string,因为它比使用scanf()更安全,假设用户不会意外或故意地犯错。

 Enter values for A, B, C, in the format: "AB - C" 1 2 3 Values: A:1, B:2, C:0 Enter values for A, B, C, in the format: "AB - C" 1 2 - 3 Values: A:1, B:2, C:3 

现在,考虑最后一次运行:您会看到scanf()多个连续的空白字符压缩为单个字符,因此为什么这些最终运行成功:

 Enter values for A, B, C, in the format: "AB - C" 1 2 - 3 Values: A:1, B:2, C:3 Enter values for A, B, C, in the format: "AB - C" 1 2 - 3 Values: A:1, B:2, C:3