1

我正在尝试将输入输入数组,直到用户输入 -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 中运行时问题没有出现。

插入打印语句显示代码确实挂在 scanf 语句处。

有谁知道可能是什么原因造成的?

4

4 回答 4

2

你从来没有检查过你保存的数据的值(它是检查下一个未初始化的元素),do while 更合适

#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
于 2012-12-02T05:06:42.880 回答
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.

再次 - 请澄清您是否使用“Enter”键。如果是这样,请告诉我们您的平台(例如 Windows、Linux、MacOS 等)。

'希望有帮助...

于 2012-12-02T04:39:39.067 回答
0

您的代码取决于未初始化的数组元素的值。难怪它的行为不合理。

在您的while周期条件下,您input[i]与进行比较-1。每次迭代input[i]都没有初始化 - 它包含一个垃圾值。由于垃圾值不太可能等于-1,因此您的循环会继续运行并运行,每次都停止scanf以等待输入。这造成了一种“悬而未决”的错觉scanf,而实际上它scanf本身与真正的问题无关。

当然,这里真正的问题不是数组未初始化,而是您的循环条件检查了错误的数组元素。您可能打算检查最近输入的元素。相反,您检查下一个元素。为什么?

我想说你的意图需要一个带有后置条件的循环。

于 2012-12-02T04:44:45.207 回答
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;
} 
于 2012-12-02T05:06:05.520 回答