如何处理错误输入C?

时间:2014-02-03 19:38:20

标签: c input scanf

初学者提问: 想象一下这种情况:我请求用户输入一个整数(通过使用scanf获取它),但是用户输入一个字符,因为程序到达它的结束...但我想克服它,并让程序告诉他他提供了无效输入并给用户另一个输入输入的机会,我该怎么做?

6 个答案:

答案 0 :(得分:2)

使用fgets(),然后sscanf()strtol()

int number;
char ch;
char *Prompt2 = "":
do {
  printf("%sEnter number :", Prompt2);
  Prompt2 = "Invalid input\n";  // Change Prompt2 
  buffer char[50];
  if (fgets(buffer, sizeof buffer, stdin) == NULL) {
    Handle_EOF();
  }  
} while (sscanf(buffer, "%d %c", &number, &ch) != 1);

使用strtol()代替sscanf()会增加+/-溢出保护,因为它会设置errno

  char *endptr; 
  errno = 0;
  long number = strtol(buffer, &endptr, 10);
  if (errno || buffer == endptr || *endptr != '\n') Handle_Error(();

请参阅Read_long()作为如何使用此功能的示例。

答案 1 :(得分:1)

初​​学者用stdio.h中,这是家庭作业非常好,工作只要你不要指望任何幻想,比如密码字段输入,输入编辑功能,在打字时,功能键和控制键的处理格式等错误输入可以做什么仅限于基础知识。

如果你需要在C中编写一个专业的应用程序,这是我们过去在70年代和80年代所做的事情,在C中,你必须避免使用stdio.h,因此需要扫描输入。您必须检查您的操作环境和社区必须提供的内容。 Cursesncurses可能会帮助您。在MS-DOS中,我们用来捕获中断,以便对键盘进行绝对控制。在Unix中,我们使用了Bill Joy的termcapterminfo库,这将允许您控制终端和键盘。作为一个例子,vi编辑器基于termcap和cufo on terminfo。

请记住,创建一个清晰的基于文本的用户界面并不是一项微不足道的任务,也不容易完全控制用户的输入。幸运的是,它也不再是问题,因为Java和Swing已经存在......

答案 2 :(得分:0)

scanf的返回值是成功扫描的参数数量。

答案 3 :(得分:0)

基本技术是检测问题(来自*scanf()的意外返回值),然后读取行的其余部分(狼吞虎咽字符到换行符或EOF),然后恢复。

或者,通常更好(尤其是因为错误报告可以报告整行),是使用fgets()getline()来读取整行,然后使用sscanf()或其他解析该行的技术,并从那里开始。

答案 4 :(得分:0)

怎么样:

  int n;
  int c;
  printf("Please enter an integer: ");
  while (scanf("%d", &n) != 1) {
    while (!isspace(c = getchar()));
    ungetc(c, stdin);
    printf("You must enter a valid number. Try again.\n");
    continue;
  }

答案 5 :(得分:0)

您可以将用户的输入作为字符串读取,然后使用strtol()使其成为整数。

int main(void)
{
  char* end;
  char number_temp[256];

  int number;  

  while(1)
  {
     puts("Give a number");
     scanf("%s",number_temp);

     number = strtol(number_temp, &end, 10);

     if (end)              //If there is an error the value of *end will be non zero
        printf("try again");
     else
        break;
  }
  return 0;
}