C代码挂在scanf()语句中

时间:2012-12-02 04:25:13

标签: c arrays loops scanf hang

我正在尝试输入数组,直到用户输入-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语句中。

有没有人知道造成这种情况的原因是什么?

4 个答案:

答案 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;
}