这段代码scanf("%d")
和之间scanf("%d ")
的区别是什么,其中差异是格式字符串中的尾随空白?
#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;
}
Run Code Online (Sandbox Code Playgroud)
scanf()
当我在格式说明符之后添加空格时,函数如何实际工作scanf("%d ", &j);
?
Chr*_*odd 20
scanf格式的空白字符使其显式读取并忽略尽可能多的空白字符.因此scanf("%d ", ...
,在读取数字之后,它将继续读取字符,丢弃所有空格,直到它在输入上看到非空白字符.该非空白字符将留作输入函数读取的下一个字符.
使用您的代码:
printf("enter a value for j ");
scanf("%d ",&j);
printf("j is %d \n", j);
Run Code Online (Sandbox Code Playgroud)
它将打印第一行,然后等待您输入一个数字,然后继续等待数字之后的某些内容.因此,如果您只是键入5Enter,它将显示为挂起 - 您需要键入另一行,其中包含一些非空格字符才能继续.如果您输入6Enter,那么它将成为值i
,因此您的屏幕将如下所示:
enter a value for j 5
6
j is 5
enter a value for i i is 6
Run Code Online (Sandbox Code Playgroud)
此外,由于大多数的scanf%-conversions也跳过前导空白(所有除%c
,%[
和%n
),空格之前%-conversions是无关的("%d"
并且" %d"
将起相同作用的).所以在大多数情况下,你应该避免scanf转换中的空格,除非你知道你因为它们的特殊效果而特别需要它们.
格式字符串中的空白字符(空格,换行符,水平和垂直制表符)与输入中的任意数量的空白字符相匹配.
在你的第一个案例
scanf("%d ",&j);
Run Code Online (Sandbox Code Playgroud)
当它遇到白色空间字符(WSC)时,' '
它会吃掉用户输入的所有空白区域,包括\n
按下Enter时它将进入非WSC.在这种情况下,您的程序将按Ctrl+键终止Z.