0

私の fgets() の実装はここでは間違っているようです。

これがコードです

int main(int argc, const char* argv[]){
    int numIntegers;
    char buffer[20];
    int intArray[10];
    //if no argument is passed in, terminate
    if (argc == 1){
            printf("no argument given, terminating..\n");
            return EXIT_FAILURE;
    }
    else{
            numIntegers = atoi(argv[1]);
            //we only want numbers greater than 0
            if (numIntegers <= 0){
                    printf("# must be greater than 0\n");
                    return EXIT_FAILURE;
            }
            else{
                    printf("Enter %d integer values to place in array: \n", numIntegers);
                    for (int i = 0; i < numIntegers; i++){
                            fgets(buffer, numIntegers, stdin);
                            intArray[i] = atoi(buffer);
                            printf("Index is = %d \n", i);
                    }
            }
    }

    //for (int i =0; i < numIntegers; i++){
    //      printf("Index[%d] = %d \n", i, intArray[i]);
    //}
}

出力は次のとおりです。整数以外のテキストがない行はユーザー入力です。i の値がどのようにリセットされるかに注目してください。この問題は、10 を超える初期引数を指定した場合にのみ発生します。何らかの理由で for ループが無限ループに変わります。

$ ./a.out 11
Enter 11 integer values to place in array:
5
Index is = 0
2
Index is = 1
1
Index is = 2
2
Index is = 3
3
Index is = 4
4
Index is = 5
123
Index is = 6
123
Index is = 7 
123
Index is = 8
1
Index is = 9
2
Index is = 2
2
Index is = 3
3
Index is = 4
5
Index is = 5
1
Index is = 6
12
Index is = 7
4

1 に答える 1

2

使用している

fgets(buffer, numIntegers, stdin);

2番目のパラメータはバッファのサイズでなければなりません - あなたの場合は20です。それは少なくとも1つの明らかな問題です...

numIntegers次の問題: 10 より大きい値を許可していますintArray。それも直さねば…

if(numIntegers > 10) {
  printf("cannot have number greater than 10!\n");
  // abort, retry, ignore...
}

実際、バグが解決されたコードは次のとおりです。気が変わった場合に複数の場所でサイズを変更する必要がないように、BUFSIZEとの定義されたサイズの使用に注意してください...MAXNUM

#include <stdio.h>
#define BUFSIZE 20
#define MAXNUM 10
#define EXIT_FAILURE 0

int main(int argc, const char* argv[]){
    int i, numIntegers;
    char buffer[BUFSIZE];
    int intArray[MAXNUM];
    //if no argument is passed in, terminate
    if (argc == 1){
            printf("no argument given, terminating..\n");
            return EXIT_FAILURE;
    }
    else{
            numIntegers = atoi(argv[1]);
            //we only want numbers greater than 0
            if (numIntegers <= 0 || numIntegers > MAXNUM){
                    printf("# must be greater than 0 and less than %d!\n", MAXNUM);
                    return EXIT_FAILURE;
            }
            else{
                    printf("Enter %d integer values to place in array: \n", numIntegers);
                    for (i = 0; i < numIntegers; i++){
                            fgets(buffer, BUFSIZE, stdin);
                            intArray[i] = atoi(buffer);
                            printf("Index is = %d \n", i);
                    }
            }
    }
 }

最後に、整数カウンターが「リセット」されているように見えるのはなぜでしょうか? まあ-あなたintArrayはスタック上の10個の整数のブロックです。ループ変数を宣言すると、メモリ内の次の場所iを占有します(ループに到達する前に最後に変数が宣言されたときと同様)- (あなたがいるメモリ位置に「インデックス」を付けるとたまたま到達します)アクセスは許可されていませんが、とにかくアクセスしました)。たまたま値を入力したため、...にリセットされました。int intArray[10];forintArray[10]2i2

プログラムの開始時に宣言していた場合i(私のコンパイラはデフォルトで C99 を "実行" しないので、私のように - 私はそれほど年をとっています!)、問題は別の方法で発生するか、まったく発生しませんでした。

于 2013-10-08T21:32:45.003 に答える