-2

可能重复:
如果用户输入非数字字符,如何仅扫描整数并重复阅读?

嗨,我是 c 新手,我正在编写一个程序,要求用户输入一个整数,如果它不符合一定范围内的标准,比如小于 20,但大于 5。它询问用户再次输入值。

但是我想知道如果我输入一个字符会发生什么,并且它会创建一个无限循环。

所以我想知道是否有一种方法或一个特定的函数可以检查输入的值,看看它是否是正确的数据类型。而且我不会提醒用户。

4

6 回答 6

6

许多人已经尝试过,但到目前为止,在制造能够控制用户大脑以防止用户有时按下错误(某种)按钮的计算机方面还没有取得任何成功......;)

有两种普遍接受的解决方案来解决这个问题:

  1. 编写一个直接输入函数,读取“无回显”,并丢弃[可能显示一些消息]错误输入,以及“知道”什么是有效输入的特定输入函数。

  2. 使用标准函数将输入读取为文本字符串,然后(尝试)将字符串输入转换/验证为数字或其他内容。在这里,如果转换/验证失败,您会打印一些消息并要求用户重试。

于 2012-12-31T16:56:03.433 回答
5

为了应对这种可能性,您必须将输入扫描为文本,然后自行进行健全性测试。

于 2012-12-31T16:47:09.883 回答
2

您可以阅读,scanf("%d")如果用户输入一个包含非数字字符的字符串,那么您必须在再次阅读之前清理标准输入缓冲区scanf("%d")

当你清理标准输入时,你将停止无限循环

使用以下功能清理您的标准输入

int clean_stdin()
{
    while (getchar()!='\n');
    return 1;
}

并且可以通过这种方式从标准输入读取整数:

char c;
do
{  
    printf("\nEnter an integer from 5 to 20: ");

} while (((scanf("%d%c", &rows, &c)!=2 || c!='\n') && clean_stdin()) || rows<5 || rows>20);
于 2012-12-31T16:59:50.347 回答
1

一种常见的方法是将输入读取为文本,然后使用类似strtolor的库函数转换为目标类型strtod。这两个功能还允许您检测错误输入。

这是一种方法:

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <ctype.h>

int main(void)
{
  char instr[12];
  int  value;
  char *chk;

  /**
   * Make sure read is successful
   */
  errno = 0;
  if (!fgets(instr, sizeof instr, stdin))
  {
    perror("Unable to read input string");
    exit(-1);
  }

  /**
   * Make sure user didn't enter more characters
   * than we're prepared to handle.
   */
  if (!strchr(instr,'\n'))
  {
    fprintf(stderr, "Input too long for buffer, discarding...\n");
    while (!strchr(instr,'\n'))
      fgets(instr, sizeof instr, stdin);
     exit(-1);
  }
  else
  {
    *strchr(instr,'\n') = 0;
  }


  /**
   * Convert text to decimal integer using strtol
   */
  value = (int) strtol(instr, &chk, 10);
  if (!isspace(*chk) && *chk != 0)
  {
    fprintf(stderr, "%s\n", instr);
    fprintf(stderr, "%*s^\n", (int)(chk - instr), " ");
    fprintf(stderr, "Invalid character detected in input string\n");
    exit(-1);
  }

  printf("Converted input value is %d\n", value);
  return 0;
}

因此,假设您没有读取错误并且用户没有输入令人讨厌的长输入,您可以使用strtod将文本字符串转换为相应的整数值。 chk将被设置为指向不属于有效整数常量的第一个字符。如果该字符不是空白字符 ( isspace(*chk)) 或 0 终止符,则输入不是有效的整数字符串。然后你可以把它扔掉并要求一个新的输入。

于 2012-12-31T19:19:39.087 回答
0

C中的标头中有一些函数<ctype.h>..

isalpha()用于检查输入的输入是否为字母表。

您可以在字符串中输入并检查每个字符是字母还是数字..将其保持在循环中以检查它,如果给定的输入无效,则要求用户重新输入..

isdigit()用于检查给定输入是否为数字..

int is_alpha(char *s)
{
    while(*s) {
      if(isalpha(*s))
            s++;
        else 
            return 0;
    }

        return 1; 
   }

上面的函数检查输入的输入是否都是字母。如果条件失败,我返回“0”,如果条件为假,则返回“1”。

在 main 函数中收集返回值并检查..

于 2012-12-31T16:52:10.510 回答
-1

确实存在可以检查输入的数字是整数还是输入的字符实际上在 az 之间的函数。

但是没有可以为特定范围设置的功能,您必须自己设计。一个简单的函数可以像

int check(int a)
{
if(a>5 && a<20)
{
printf("Need a different Value");
}
}
于 2012-12-31T16:54:44.350 回答