使用scanf()进行输入验证

5
我有一个程序,它从用户那里接受一个整数并将此数字用于加法运算。
我使用的代码如下所示:
```html

我有一个程序,它从用户那里接受一个整数并将此数字用于加法运算。

我使用的代码如下所示:

```
scanf("%d", &num);

如何验证输入,使得如果用户输入了一个带有小数点的字母或数字,则在屏幕上显示错误消息?

1
首先将输入作为字符串是一种方法。请参阅https://dev59.com/_2kw5IYBdhLWcg3woMBD。 - nims
2个回答

12
你应该使用 scanf 的返回值。从 man scanf 中可以看到:

返回值

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

所以代码可能如下所示:

if (scanf("%d", &num) != 1)
{
    /* Display error message. */
}

注意,它不适用于“带小数点的数字”。对于这种情况,您应该使用解析和 strtol 等方法。这可能会更加复杂。

我本来想告诉你关于十进制数部分的。我会查一下 strtol 函数的工作原理。谢谢。 - Matthew
那么在C语言中就没有办法捕捉这种情况吗?例如,在Java中,如果将float类型的值传递给整数变量,就会引发异常。 - Matthew
@Matthew,问题是scanf不能将其读为浮点数,它会将其读为整数后面跟着一个非整数('.'),因为你告诉了它期望一个整数。 - teppic

1
使用scanf%s转换说明符或使用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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接