C:char的scanf无法按预期工作[重复]

问题描述 投票:4回答:2

我最近在PC上运行c程序。它有一个for循环,其中扫描了一些字符。 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时,for跳过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时,它不能正常工作。

c char scanf
2个回答
19
投票

您必须更改

scanf("%c", &d);

to

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

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

注意:

    按下[[
  1. [ENTER]]键会生成一个\n,它是%c格式说明符的有效输入。在%c之前添加一个空格会告诉scanf()忽略所有前导类似空格的输入(包括先前存储的\n),并从stdin中读取第一个非空白字符。

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

2
投票
问题是,当您输入scanf("%c", &d);的字符时,您按Enter键。该字符由scanf占用,而换行符则保留在标准输入流(stdin)中。下次调用scanf(带有%c)时,它会在\n中看到stdin字符并使用它,因此不再等待进一步的输入。
© www.soinside.com 2019 - 2024. All rights reserved.