由于 scanf 失败,getchar 无法读取

时间:2021-03-10 07:03:27

标签: c stdio

#include <stdio.h>

int main() {
    float f;
    char s;
    if (scanf("%f", &f) == 1) {
        printf("%f", f);
    }
    else {
        s = getchar();
        printf("'%c'", s);
    }
}

这适用于浮点数,当我输入“*”或“/”时。 为什么这不适用于“+”和“-”?

 ./a.out 
*
'*' 

这是输出,这就是我想要的。但是在'+'的情况下

./a.out
+
'
'

这正在发生,我希望“+”成为输出。

似乎 scanf 的失败以某种方式干扰了 getchar()

1 个答案:

答案 0 :(得分:3)

+ 是开始浮点值的有效字符,因此 scanf 将在失败之前消耗它,因为 + 之后没有数字。

然后 getchar 将读取 + 之后的下一个字符,即 \n 换行符。

如果您想在无效浮点值(例如 +-)的输入中捕获前导 "+\n"(或 "-xyz"),那么您将必须将其读取为字符串,然后再解析它,例如使用 sscanf,如果它不解析为浮点数,则将其用作字符串。