0

私はCプログラムを作っています。すべてがうまく機能しているように見える機能があります。しかし、それに別の変数を追加すると、突然機能せず、セグメンテーション違反が発生します。(gdbを使用すると、エラーが発生します:行番号情報がない関数__svfscanf_lを終了するまでシングルステップします。プログラム受信信号:「EXC_BAD_ACCESS」。)

これが私の関数です:

void condition(char *command) {
printf("CAMMAND: %s\n", command);
char *cond;
char *expression;
char *file;
char *buffer;
buffer = malloc(200 * sizeof(char));

sscanf(command, "%s ( %s %s ) %[^\n]", cond, expression, file, buffer);

printf("COND: %s\n", cond);
printf("EX: %s\n", expression);
printf("File: %s\n", file);
printf("Command: %s\n", buffer);

if (!strcmp(expression, "checke")) {
    printf("CHECK EXISTS\n");
    if (file_exists(file)) {
        printf("EXISTS\n");
    }
} else if (!strcmp(expression, "checkd")) {
    printf("CHECK DIR\n");
} else if (!strcmp(expression, "checkr")) {
    printf("READ\n");
} else if (!strcmp(expression, "checkw")) {
    printf("CHECK WRITE\n");
} else if (!strcmp(expression, "checkx")) {
    printf("CHECK EX\n");
} else {
    printf("NOOOO\n");
}
}

ただし、以下のように変更してもエラーになります。sscanf呼び出しで失敗しているようです。しかし、変数を追加しない場合は機能します。

void condition(char *command) {
int flag;
printf("CAMMAND: %s\n", command);
char *cond;
char *expression;
char *file;
char *buffer;
buffer = malloc(200 * sizeof(char));

sscanf(command, "%s ( %s %s ) %[^\n]", cond, expression, file, buffer);

printf("COND: %s\n", cond);
printf("EX: %s\n", expression);
printf("File: %s\n", file);
printf("Command: %s\n", buffer);

if (!strcmp(expression, "checke")) {
    printf("CHECK EXISTS\n");
    if (file_exists(file)) {
        printf("EXISTS\n");
    }
} else if (!strcmp(expression, "checkd")) {
    printf("CHECK DIR\n");
} else if (!strcmp(expression, "checkr")) {
    printf("READ\n");
} else if (!strcmp(expression, "checkw")) {
    printf("CHECK WRITE\n");
} else if (!strcmp(expression, "checkx")) {
    printf("CHECK EX\n");
} else {
    printf("NOOOO\n");
}
}

これがなぜなのか理解できないようです。どんな助けでも素晴らしいでしょう!

4

1 に答える 1

2

変換 の宛先として、文字配列へのポインターではなく、文字へのポインターを渡しているため、メモリーが破損しています。は、定義されているように、初期化されておらず、ランダムなメモリ位置を指しています。ドキュメントの関連部分は次のとおりです。%sexpressionsscanf

s      Matches a  sequence  of  non-white-space  characters;  the  next
       pointer must be a pointer to character array that is long enough
       to hold the input sequence and the  terminating  null  character

expressionなどにいくらかのスペースを割り当てる必要があります。

于 2012-10-16T03:28:03.483 に答える