5

下面是一些应该接受来自控制台的整数输入的简单代码。在给出无效(非整数)输入之前,它工作正常。

 1 #include <stdio.h>
 2 
 3 int main()
 4 {
 5   int x = 0;
 6   int inp = 0;
 7   int nums[20]; 
 8   int idx = 0;
 9   for(;;){
10     printf("Enter an integer: ");
11     inp=scanf("%d", &x);
12     if(inp == 0){
13       printf("Error: not an integer\n");
14     }
15     else{
16       if(idx<20){
17         nums[idx] = x;
18         idx++;
19       }
20     } 
21   }
22   return 0;
23 }

这是 gdb 的输出,显示我在输入值“g”后逐步执行程序。看看它是如何跳到第 18 行的,然后无法从用户那里寻找进一步的输入。

Starting program: /Users/jeffersonhudson/xxxx/hw1 
Enter an integer: g

Breakpoint 1, main () at hw1.c:12
12          if(inp == 0){
(gdb) n
13              printf("Error: not an integer\n");
(gdb) n
Error: not an integer
0x0000000100000ee4  18                  idx++;
(gdb) n
10          printf("Enter an integer: ");
(gdb) n
11          inp=scanf("%d", &x);
(gdb) n

Breakpoint 1, main () at hw1.c:12
12          if(inp == 0){
(gdb) 

这是程序输入错误后的输出:

Enter an integer: Error: not an integer
Enter an integer: Error: not an integer
Enter an integer: Error: not an integer
Enter an integer: Error: not an integer
Enter an integer: Error: not an integer
Enter an integer: Error: not an integer
Enter an integer: Error: not an integer
Enter an integer: Error: not an integer
Enter an integer: Error: not an integer
Enter an integer: Error: not an integer
Enter an integer: Error: not an integer
Enter an integer: Error: not an integer
Enter an integer: Error: not an integer
Enter an integer: Error: not an integer
Enter an integer: Error: not an integer
^C

有人可以帮我弄清楚我在这里做错了什么吗?

4

3 回答 3

7

在您的代码中,当您检测到时if(inp == 0),这实际上意味着scanf()没有读取任何内容,因为它找到的第一个标记既不是整数也不是空格。因此它没有在输入上前进,您可以将其丢弃,否则它会一直卡住不读取任何内容。

有两种简单的方法可以使用 scanf 修复它:

1)当您检测到 时inp == 0,只需调用 ascanf("%*s");即可丢弃字符串标记。

2) 将其读入 char 数组,并使用 atoi(str) 检索整数值。例如:

int idx = 0;
char aux[250]; // watchout for buffer overflows.
for(;;){
    printf("Enter an integer: ");
    scanf("%s", aux); // look at ways to avoid overflows here
    inp = atoi(aux);
    if(inp == 0 && aux[0] != '0'){
      printf("Error: not an integer\n");
    }
    ...

但是请注意,上面的第二个示例会将输入视为10abcvalue 的整数10。如果您真的想强制不存在非整数字符,您可以快速扫描数据。而且我相信这超出了您的作业范围,但是您应该注意将来有关缓冲区溢出的问题:)

于 2013-05-23T23:46:14.447 回答
-1

您必须输入无效字符,例如空格/回车/...

刷新标准输入以清除缓冲区。

fflush(stdin) ANSI C

于 2013-05-23T23:33:08.740 回答
-1
inp=scanf("%d", &x);

替换为

inp=scanf("%d", &x);
while('\n'!=getchar());
于 2013-05-23T23:50:40.100 回答