3

如何确保用户只输入数值而不是字母数字或任何其他字符?还要寻找什么来为不正确的输入插入错误消息?

#include<stdio.h>

int main()
{
   int a, b, c;


   printf("Enter first number to add\n");
   scanf("%d",&a);

   printf("Enter second number to add\n");
   scanf("%d",&b);

   c = a + b;

   printf("Sum of entered numbers = %d\n",c);

   return 0;
}
4

4 回答 4

3

如果您真的想处理可能是敌对的用户输入,请使用单独的函数来获取数字。

允许
- 前导空格:“123”
- 尾随空格:“123”
- 前导零:“0000000000000000000000000000000000123”
- 错误输入后很好地重新扫描。
捕获以下错误
- 无输入:“”
- 数字后的额外文本:“123 abc”
- 数字前的文本:“abc 123”
- 拆分数字:“123 456”
- 上溢/下溢:“12345678901234567890”
- 其他: "--123"
重新提示无效输入。

#include <errno.h>
#include <stdio.h>
#include <stddef.h>

int GetInteger(const char *prompt, int *i) {
  int Invalid = 0;
  int EndIndex;
  char buffer[100];
  do {
    if (Invalid)
      fputs("Invalid input, try again.\n", stdout);
    Invalid = 1;
    fputs(prompt, stdout);
    if (NULL == fgets(buffer, sizeof(buffer), stdin))
      return 1;
    errno = 0;
  } while ((1 != sscanf(buffer, "%d %n", i, &EndIndex)) || buffer[EndIndex] || errno);
  return 0;
}

int main() {
  int a, b, c;
  if (GetInteger("Enter first number to add\n", &a)) {
    ; // End of file or I/O error (rare)
  }
  if (GetInteger("Enter second number to add\n", &b)) {
    ; // End of file or I/O error (rare)
  }
  c = a + b;
  printf("Sum of entered numbers = %d\n",c);
  return 0;
}

顺便说一句,你不应该这样printf("Enter first number to add\n")。改为使用fputs()。考虑一下如果字符串中有 a 会发生%什么。

于 2013-09-04T20:59:26.253 回答
1

最好完全避免使用scanf。用于fgets获取整行,然后用于sscanf提取您需要的信息。检查返回值sscanf以确保输入符合预期。

于 2013-09-03T04:56:21.293 回答
0

请阅读scanf的手册页。您需要检查返回值。如果能够匹配一个数字,应该返回 1。

于 2013-09-03T04:55:02.393 回答
0

编辑-我需要getchar()在while循环中添加,因为未读的非数字项留在输入队列中导致程序进入无限循环,此外,我还while为同一事物添加了更紧凑的循环形式,两者会有同样的效果。

您可以检查它的返回值,scanf如果与格式说明符成功匹配,则返回 1,否则返回 0。您可以为您的程序这样做:

#include <stdio.h>
#include <stdbool.h>
int main(void)
{ 
  int num;
  bool status;//_bool may also be used and stdbool.h won't be needed for that

  status = scanf ("%d",&num);

  if (status != 1 )
    {
      getchar();// needed to add it to eat up the unread item left in input queue.
      while (status != 1)
        {
          printf (" sorry ! incorrect input :ERROR: try again");

          status = scanf("%d", &num);

        }
    }
  /*....do something...*/
  return 0;
}

更紧凑的while循环形式:-

while (scanf("%d",&num) != 1)
    {
      getchar();
          printf (" sorry ! incorrect input :ERROR: try again\n");
    }

此外,您应该始终为变量使用有意义的名称,例如num1andnum2而不是aand b

于 2013-09-03T06:33:45.860 回答