我正在尝试输入数组,直到用户输入-1退出输入模式。
当输入-1但仅在输入至少两个值之后,在此代码块中发生了奇怪的事情。
#define ARRAYSIZE 100
int input[ARRAYSIZE];
int i=0;
do {
printf("Enter data #%d or -1 to exit: ", i);
scanf("%d", &input[i]);
} while(input[i++] != -1 && i<ARRAYSIZE)
代码将无限期挂起。我已经编译并运行在两个独立的体系结构上,但是当它在gdb中运行时,问题不会出现。
插入print语句显示代码确实挂在scanf语句中。
有没有人知道造成这种情况的原因是什么?
答案 0 :(得分:2)
你从来没有检查过你保存的数据的值(它检查了下一个未初始化的元素),同时做的更合适
#define ARRAYSIZE 100
int input[ARRAYSIZE],i=0;
do {printf("Enter data #%d or -1 to exit: ", i);
scanf("%d", &input[i]);
}while(input[i] != -1 && ++i<ARRAYSIZE);
//if this is main() you need a return 0; here also or it will hang
答案 1 :(得分:0)
我的问题:
3)在进入循环之前,“i”是否初始化为0?
2)“input []”是否声明为带有一个或多个“int”元素的整数数组?
......和......
1)点击“输入”后它是否仍然挂起?
如果您还没有意识到这一点,那么必须点击“输入”,然后scanf()将处理任何输入。
建议:
#include <stdio.h>
#define ARRAYSIZE 100
int
main ()
{
int input[ARRAYSIZE];
int i=0;
int entry=0;
while(entry != -1 && i<ARRAYSIZE) {
printf("Enter data #%d or -1 to exit: ", i);
scanf("%d", &input[i]);
entry = input[i];
fprintf (stderr, "entry= %d, input[i]= %d...\n", entry, input[i]);
i++;
}
printf ("Done.\n");
return 0;
}
请注意“fprintf(stderr)”。
示例输出:
Enter data #0 or -1 to exit: 300
entry= 300, input[i]= 300...
Enter data #1 or -1 to exit: -1
entry= -1, input[i]= -1...
Done.
再次 - 请说明您是否使用“回车”键。如果是这样,请告诉我们您的平台(例如Windows,Linux,MacOS等)。
'希望有所帮助......
答案 2 :(得分:0)
您的代码取决于未初始化的数组元素的值。难怪它表现得非理性。
在while
周期的条件下,您将input[i]
与-1
进行比较。在每次迭代input[i]
未初始化时 - 它包含垃圾值。由于垃圾值不太可能等于-1
,因此您的周期保持运行和运行,每次在scanf
停止等待输入。这会产生一种“挂在scanf
”的错觉,而实际上scanf
本身与真正的问题无关。
当然,这里真正的问题不是数组是未初始化的,而是你的循环条件检查错误的数组元素。您可能打算检查最近输入的元素。而是检查下一个元素。为什么?
我会说你的意图需要一个 post 条件的循环。
答案 3 :(得分:0)
使用其他变量检查-1。像这样:
#include <stdio.h>
#define ARRAYSIZE 10
int main(int argc, char **argv) {
int data[ARRAYSIZE];
int input = 0;
int i = 0;
while(input != -1 && i < ARRAYSIZE) {
scanf("%d", &input);
data[i] = input;
i++;
}
return 0;
}