-3
#include<stdio.h>
#include<string.h>
int main(void) {
    int t, n, i, j;
    char dir[41][52];
    char right[] = "Right";
    char left[] = "Left";
    char *p = NULL, storeDir[10], *k = NULL;
    scanf("%d", &t);
    while(t--) {
        scanf("%d", &n);
        fflush(stdin);
        for(i = 0; i < n; i++) {
            gets(dir[i]);
            fflush(stdin);
        }
        i = n - 1;
        k = dir[i];
        j = 0;
        p = strchr(dir[i], 'o');
        while(*k != ' ') {
            storeDir[j] = *k;
            k++;
            j++;
        }
        storeDir[j] = '\0';
        printf("Begin ");
        printf("%s\n", p);
        for(i = n - 2; i  >= 0; i--) {
            if(strcmp(storeDir, right) == 0) {
                printf("Left ");
            }
            else if(strcmp(storeDir, left) == 0) {
                printf("Right ");
            }
            k = dir[i];
            j = 0;
            p = strchr(dir[i], 'o');
            while(*k != ' ') {
                storeDir[j] = *k;
                k++;
                j++;
            }
            storeDir[j] = '\0';
            printf("%s\n", p);
        }
        printf("\n");
    }
    return 0;
}

これは、いくつかの文字列を取り込んで、ポインターで操作することによって出力するコードです。私のコンピューターでは正常に動作しますが、 http://ideone.com/で実行すると SIGSEGV エラーが発生します。無効なポインタ参照が原因だと思います。しかし、私はどこが間違っているのか理解できません。誰かが私にそれを指摘してもらえますか? プログラムのサンプル テスト ケースを次に示します。

4
Begin on Road A
Right on Road B
Right on Road C
Left on Road D

ティア

4

1 に答える 1

3
  1. あなたが使用しているgets():それをしないでください
  2. エラーコードをチェックしていません。正確に正しい形式でscanf()データを受信しない場合、正しい値は得られません。n
  3. エラーコードをチェックしてstrchr()いません: が見つからない場合oは NULL を返します
  4. あなたの「テストデータ」には正しいデータがありません。これをエラーチェックなしと組み合わせると、災害のレシピになります。

ここで問題が発生します。「テストデータ」に反映されていないscanf()ロードを実行します(実際には1つしかリストされていない場合、4つのレコードを示します)。t次の文字は、食べるが続かないキャリッジ リターンです。scanf()

next scanf()to readnは次の文字Newlineを取得しますが、これは数字ではないため失敗します。

これで、乱数 (スタック上にあるものは何でも) を取得しn、これを呼び出しgets()て、ランダムなスロットにデータをロードしdir[]ます。入力キューに残っている文字は改行であるため、空の文字列が返されます。

予期したinstrchr()が見つからない場合はNULL を返し、それを in で逆参照します。ここでプログラムがクラッシュします: null ポインター例外です。もちろん、運が良くて一部のデータを上書きするか、スタックに に収まるほど小さい数値が含まれている場合を除きます。o"on"storeDirgets()dir

プログラムに「正しい」データを与えると、次のようになります。

1 4 Begin on Road A
Right on Road B
Right on Road C
Left on Road D

プログラムは正常に完了します。

于 2012-12-23T19:17:55.630 に答える