【问题标题】:Validating input using scanf (check whether input is char or int)使用 scanf 验证输入(检查输入是 char 还是 int)
【发布时间】:2015-06-09 17:04:30
【问题描述】:

我希望用户输入的输入应该介于 0 和 100 之间。如果他或她输入负数或大于 100 的数字或字符,则必须触发循环。我正在使用 do-while 循环来验证用户输入的输入。但是如果我输入一个字符,do while 循环就会无限次执行。谁能解释为什么会这样!以及如何检查用户是否输入了 char 或 int?

代码用 C 编写并使用 GCC 编译。

int num;
do
{
    printf("num :");
    scanf("%d", &num);
}
while(num<0 ||  num>=100);

【问题讨论】:

  • “如果他或她输入负数或大于 100 的数字或字符,则必须触发循环”您的意思是您的循环应该停止还是开始?
  • 你需要清除输入缓冲区
  • @prudhvi 是的,循环应该开始。但是当我输入一个字符时,语句“num:”被无限打印出来
  • @AlejandroDíaz 你能详细说明一下吗?
  • @prudhvi 如果用户输入无效,循环应该继续。即只有当用户输入负数或大于 100 的数字或任何字符时,循环才应该起作用。在负数和大于 100 的情况下运行良好。但是当我输入一个字符时,循环正在无限执行

标签: char int scanf


【解决方案1】:

scanf() 期待一个数字,如果它发现无效输入(与提供的格式不匹配的东西)它将返回,离开输入缓冲区,这意味着将这个无效输入留在那里,然后循环条件计算为true 并且scanf() 尝试再次读取一个数字以找到与以前相同的无效输入,这将永远重复。

清理输入缓冲区会解决这个问题,你可以这样清理它:

#include <stdio.h>

void cleanBuffer(){
    int n;
    while((n = getchar()) != EOF && n != '\n' );
}
int main(int argc, char *argv[]) 
{
    int num = -1;
    do
    {
        printf("num :");
        scanf("%d", &num);
        cleanBuffer(); //we clean the buffer here
    }
    while(num<0 ||  num>=100);
    return 0;
}

【讨论】:

  • 你能提供一些参考,我可以从哪里阅读更多关于输入缓冲区的信息?
猜你喜欢
  • 2013-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-06
  • 1970-01-01
  • 2019-07-09
  • 1970-01-01
相关资源
最近更新 更多