防止用户输入错误的数据类型

时间:2012-12-31 16:45:11

标签: c

  

可能重复:
  How to scanf only integer and repeat reading if the user enter non numeric characters?

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

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

所以我想知道是否有一种方法或特定函数将检查输入的值以查看它是否是正确的数据类型。我不会重新谴责用户。

6 个答案:

答案 0 :(得分:5)

要解决这种可能性,您必须将输入扫描为文本,然后自行进行完整性测试。

答案 1 :(得分:5)

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

有两种常用的解决方案可以解决这个问题:

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

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

答案 2 :(得分:1)

您可以使用scanf("%d")阅读,如果用户输入包含非数字字符的字符串,则必须先清理stdin缓冲区,然后再使用scanf("%d")进行阅读。

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

使用以下函数清理标准输入

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

从stdin读取整数可以这样做:

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);

答案 3 :(得分:1)

常用方法是将输入作为文本读取,然后使用strtolstrtod等库函数转换为目标类型。这两个函数还允许您检测错误的输入。

这是一种方法:

#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终止符,则输入不是有效的整数字符串。然后你可以扔掉它并要求新的输入。

答案 4 :(得分:0)

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

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

你可以在字符串中输入并检查每个字符是字母还是数字..将它保存在循环中以检查它并要求用户重新输入,如果给定的输入是无效的.. < / p>

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

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

        return 1; 
   }

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

收集主函数中的返回值并检查..

答案 5 :(得分:-1)

确实存在可以检查输入的数字是否为整数或者输入的字符实际上是在a-z之间的函数。

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

int check(int a)
{
if(a>5 && a<20)
{
printf("Need a different Value");
}
}