c - 在 C 的 while 循环中读取整数后跳过 scanf

标签 c while-loop scanf

我有一段代码用于检查 scanf 的输入是否有效。即如果 scanf 返回一个非零正数。这是我的代码的一部分:

while(scanf(" %d",&choice)<=0){
        printf("Incorrect value entered, please re-enter\n");
    }

其中“选择”是一个整数。

每次我运行这段代码时,编译器都会在执行 while 循环后跳过 scanf。我得到这样的输出:


欢迎使用捕食者/猎物计算器

请输入您的名字

丹 嗨丹

请选择以下选项之一: 1. 计算典型捕食者和猎物系统的演化 2. 计算特定捕食者和猎物系统的进化 3.计算CUSTOM捕食者和猎物系统的进化 0.退出 A 输入的值不正确,请重新输入 输入的值不正确,请重新输入 输入的值不正确,请重新输入 输入的值不正确,请重新输入 输入的值不正确,请重新输入 输入的值不正确,请重新输入 输入的值不正确,请重新输入 输入的值不正确,请重新输入 输入的值不正确,请重新输入 输入的值不正确,请重新输入 输入的值不正确,请重新输入 输入的值不正确,请重新输入 输入的值不正确,请重新输入 输入的值不正确,请重新输入 输入的值不正确,请重新输入

输入的值不正确,请重新输入

你能解释一下为什么会这样吗!我似乎无法在互联网上找到任何特定于整数读取的答案。

非常感谢,

最佳答案

您的代码的问题在于,如果用户不输入数字,您的程序将永远循环。这是因为 scanf 会反复尝试解析相同的字符串并不断失败。 你要做的是匹配用户写的任何内容,然后再次询问一个数字:

#include<stdio.h>

int main(){
    int choice;
    while(scanf("%d",&choice) <= 0){
        scanf("%*s"); // this will parse anything the user has written
        printf("Incorrect value entered, please re-enter\n");
    }
    return 0;
}

scanf 格式字符串中的 * 是赋值抑制字符,来自 scanf 手册页:

'*' assignment-suppression character: scanf() reads input as directed by the conversion specification, but discards the input. No corresponding pointer argument is required, and this specification is not included in the count of successful assignments returned by scanf().

关于c - 在 C 的 while 循环中读取整数后跳过 scanf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34165592/

相关文章:

java - 在 while 循环中设置 OnClickListener ?

c - 使用fscanf()读取每行3个数字的文件,为什么“%d%d%d%* c”和“%d%d%d”一样好?

c - 虚拟地址是特定于进程的吗?

c - 当 MACRO 不包含任何内存位置时,为什么 sizeof(MACRO) 给出 4 个字节的输出?

c - 软件pwm作为linux内核模块

java - 为掷硬币投注游戏实现 Java 代码

Java - 访问在不同的 'if/else if' 语句中创建的对象?

c - 使用 LDAP 从当前域用户获取 Active Directory 属性

c - 循环运行的次数超过 C 中指定的次数?为什么?

c++ - scanf 中的赋值顺序有保证吗?