在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