下面是一些应该接受来自控制台的整数输入的简单代码。它一直正常,直到给出无效(非整数)输入。
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
有人可以帮我弄清楚我在这里做错了吗?
答案 0 :(得分:7)
在代码中,当您检测到if(inp == 0)
时,这实际上意味着scanf()
没有读取任何内容,因为它找到的第一个标记不是整数也不是空白。因此它没有在输入上前进,并且由你来丢弃它,否则它会一直卡住而不是读取任何东西。
使用scanf有两种简单的方法可以解决它:
1)当您检测到inp == 0
时,只需调用scanf("%*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");
}
...
请注意,上面的第二个示例会将10abc
等输入视为值10
的整数。如果您确实要强制执行,则可以快速扫描数据,不存在非整数字符。我相信它超出了你的作业范围,但你应该意识到未来缓冲区溢出的问题:)
答案 1 :(得分:-1)
答案 2 :(得分:-1)
inp=scanf("%d", &x);
替换为
inp=scanf("%d", &x);
while('\n'!=getchar());