在scanf()格式字符串中尾随空格的影响是什么?

Vik*_*rma 20 c scanf

这段代码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转换中的空格,除非你知道你因为它们的特殊效果而特别需要它们.


hac*_*cks 6

格式字符串中的空白字符(空格,换行符,水平和垂直制表符)与输入中的任意数量的空白字符相匹配.
在你的第一个案例

  scanf("%d  ",&j);
Run Code Online (Sandbox Code Playgroud)

当它遇到白色空间字符(WSC)时,' '它会吃掉用户输入的所有空白区域,包括\n按下Enter时它将进入非WSC.在这种情况下,您的程序将按Ctrl+键终止Z.

  • @Dogbert; 不确定但对于MS-WIN:`Ctrl + D` (2认同)