scanf遇到格式字符串中的空格时会怎么做?

时间:2014-03-19 18:57:26

标签: c

#include <stdio.h>

int main(void)
{
    int a;
    scanf(" %d ", &a);
    printf("\n%d", a);
    return 0;  
}

当我输入并按回车键时,它等待另一个值,在给出第二个值后,它显示输出我给它的开头。为什么? scanf()遇到格式字符串中的空格时会做什么?

3 个答案:

答案 0 :(得分:3)

当格​​式字符串中有空白时,scanf()会消耗零个或多个空白字符,直到遇到非空白字符。换行符是空格。

因此,特别是对于交互式输入,格式字符串中的尾随空格是个坏主意!在您的代码中,删除尾随空格。 (请注意,您可以在第一个数字后输入任何内容,而不仅仅是另一个数字,代码将报告您输入的第一个数字;额外的数据可用于另一个读取操作,即使您的程序实际上没有读取它。)

大多数转换规范也会忽略前导空格。例外情况为%c%n%[...](最后一项是扫描集转换规范)。

答案 1 :(得分:2)

更改

scanf(" %d ",&a);  

scanf("%d",&a);  

否则scanf将等到您传递非空格字符。

答案 2 :(得分:1)

来自here

  

该函数将读取并忽略任何空格   在下一个非空白字符之前遇到的字符   (空格字符包括空格,换行符和制表符 -   见isspace)。格式字符串中的单个空格验证任何内容   从流中提取的空白字符数量(包括   无)。

所以改变

scanf(" %d ",&a); 

scanf("%d",&a);