使用 scanf() 进行输入验证 [重复]

Posted

技术标签:

【中文标题】使用 scanf() 进行输入验证 [重复]【英文标题】:Input validation using scanf() [duplicate] 【发布时间】:2013-02-20 02:59:47 【问题描述】:

我有一个程序,它接受来自用户的整数并在加法运算中使用这个数字。

我用来接受号码的代码是这样的:

scanf("%d", &num);

如何验证输入,如果用户输入带小数点的字母或数字,屏幕上会显示错误消息?

【问题讨论】:

先将输入作为字符串是一种方法。看看***.com/questions/9753346/… 【参考方案1】:

使用带有%s 转换说明符的scanf 或使用fgets 将您的输入读取为文本,然后使用strtol 库函数进行转换:

#define MAX_DIGITS 20 // maximum number of decimal digits in a 64-bit integer

int val;
int okay = 0;

do

  char input[MAX_DIGITS+2]; // +1 for sign, +1 for 0 terminator
  printf("Gimme a number: ");
  fflush(stdout);
  if (fgets(input, sizeof input, stdin))
  
    char *chk = NULL; // points to the first character *not* converted by strtol
    val = (int) strtol(input, &chk, 10);
    if (isspace(*chk) || *chk == 0)
    
      // input was a valid integer string, we're done
      okay = 1;
    
    else
    
      printf("\"%s\" is not a valid integer string, try again.\n", input);
    
  
 while (!okay);

【讨论】:

【参考方案2】:

您应该使用scanf 返回值。来自man scanf

返回值

这些函数返回成功匹配和分配的输入项的数量,该数量可能少于提供的数量,在早期匹配失败的情况下甚至为零。

所以它可能看起来像这样:

if (scanf("%d", &num) != 1)

    /* Display error message. */

请注意,它不适用于“带小数点的数字”。为此,您应该使用解析和 strtol 例如。可能有点复杂。

【讨论】:

我要告诉你十进制数字部分。我将检查 strtol 函数是如何工作的。谢谢 那么在C语言中没有办法捕捉到这种情况吗?例如,在 Java 中,如果将浮点数提供给整数变量,则会引发异常。 @Matthew 问题是 scanf 不会将其读取为浮点数,它会将其读取为一个整数,后跟一个非整数('.'),因为你已经告诉它是一个整数。

以上是关于使用 scanf() 进行输入验证 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

输入空时jQuery文本输入实时验证清除错误[重复]

在 Silverlight 中使用表单进行 Windows 身份验证 [重复]

带有动态错误消息的jquery验证添加方法[重复]

用jquery怎么验证名字在输入完之后马上提示有没有重复的代码

如何针对密码的特定字母进行身份验证[重复]

jquery验证文本输入数组仅验证第一个字段[重复]