C:scanf for char无法按预期工作

时间:2015-03-18 12:32:28

标签: c char scanf

我最近在我的电脑上运行了一个c程序。它有一个for循环,其中扫描了一些char。 for循环运行3次。在每次运行期间,它打印运行计数,然后扫描char d的值。该计划如下

#include<stdio.h>

int main(){
    int f;
    char d;
    for(f=0;f<3;f++){
        printf("Choice %d\n", f);
        scanf("%c", &d);
    }
    return 0;
}

现在麻烦的是,当我运行程序时,当f为1时,跳过scanf部分。 现在如果我改变代码如下

#include<stdio.h>

int main(){
    int f;
    int d;
    for(f=0;f<3;f++){
        printf("Choice %d\n", f);
        scanf("%d", &d);
    }
    return 0;
}

现在程序运行正常。并且forf循环的每次迭代都会执行scanf。

这里的问题似乎是什么?我的意思是当d是int类型时它工作正常,但是当d是char类型时它无法正常工作。

2 个答案:

答案 0 :(得分:9)

你必须改变

scanf("%c", &d);

scanf(" %c", &d);
       ^
       |

否则,scanf()会考虑先前输入的ENTER按键。

注意:

  1. ENTER 按键生成\n,这是%c格式说明符的虚拟输入。在%c之前添加空格告诉scanf()忽略所有前导空格类型的输入(包括先前存储的\n)并从stdin读取第一个非空白字符。< / p>

  2. 对于%d格式说明符的情况,它在扫描数字输入之前消耗(并忽略)任何前导类空白输入,因此第二种情况不会出现任何问题。

答案 1 :(得分:2)

问题是,当您为scanf("%c", &d);输入字符时,请按Enter键。该字符由scanf使用,换行符保留在标准输入流(stdin)中。当下次调用scanf(带%c)时,它会在\n中看到stdin字符并使用它,因此不会等待进一步输入。< / p>

要解决此问题,请更改

scanf("%c", &d);

scanf(" %c", &d);
//    ^Note the space before %c

%c之前的空格指示scanf扫描任意数量的空白字符(包括无字符),并在遇到非空白字符时停止扫描。引用标准:

  

7.21.6.2 fscanf功能

     

[...]

     
      
  1. 由白色空格字符组成的指令通过读取输入来执行   第一个非空格字符(仍未读取),或直到不再有字符   被阅读。该指令永远不会失败。
  2.   

使用%d工作的原因是%d格式说明符会自动跳过空格字符,而\n是空白字符,%d不会扫描它。再次引用标准:

  

7.21.6.2 fscanf功能

     

[...]

     
      
  1. 跳过输入空白字符(由isspace函数指定),除非   该规范包括[cn说明符。 284
  2.