1

ユーザーが入力モードを終了するために -1 を入力するまで、配列に入力を取得しようとしています。

-1 が入力されたときに、このコード ブロックで奇妙なことが起こっていますが、少なくとも 2 つの値が入力された後でのみ発生しています。

#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)

コードは無期限にハングします。2 つの別々のアーキテクチャでコンパイルして実行しましたが、gdb で実行すると問題は発生しません。

print ステートメントを挿入すると、実際にコードが scanf ステートメントでハングしていることが明らかになりました。

誰がこれを引き起こしているのか考えていますか?

4

4 に答える 4

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
于 2012-12-02T05:06:42.880 に答える
0

私の質問:

3) ループに入る前に「i」は 0 に初期化されていますか?

2) "input[]" は、1 つ以上の "int" 要素を持つ整数配列として宣言されていますか?

... と ...

1)「Enter」を押した後もハングしましたか?

まだ気付いていない場合は、 scanf() が入力を処理する前に「Enter」を押す必要があります。

提案:

#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 に答える