3

私はCとscanf関数をいじっていて、理解できないような奇妙なエラーに遭遇しました。次のコードがあるとします。

#include <stdio.h>
#include <stdlib.h>

typedef struct {
  int a;
} sample;

void fn(sample *s) {
  char command;
  scanf("%[abc]", &command);
  printf("Read: %c\n", command);
  printf("In the sample function:, %i\n", s->a);
}

int main() {
  sample *s = malloc(sizeof(sample));
  s->a = 4;

  printf("Before sample function: %i\n", s->a);
  fn(s);
  printf("After sample function: %i\n", s->a);

  return 0;
}

セグメント障害のようです。出力で:

$ ./sample
Before sample function: 4
a
Read: a
In the sample function:, 4
Segmentation fault (core dumped)

私はgdbを使用watchし、構造体にaを付けましたが、関数内でscanf構造体を「変更」しているようです? scanfサンプル関数 ' ' の内部の後でもfn、構造体フィールドを正常に出力できるため、これは奇妙です。ただし、 から戻って に戻るfnmain、同じ情報を出力しようとするとエラーが発生しますか?

興味深いことに、scanfto をscanf("%c\n", &command);(文字セットなしで) 変更すると、問題なく動作するようです。記録のために、私が使用している gcc のバージョンは 4.7.2 で、コードを次のようにコンパイルしていますgcc -O0 -o sample sample.c

私の唯一の考えは、おそらく文字セットが gcc でサポートされていないということですか? わからない。他の誰かがこれをクリアできるかどうか疑問に思っていますか?

4

1 に答える 1

6

scanf("%[abc]", &command);

単一の文字ではなく文字列を書き込みます。文字列の末尾のヌル文字が&command + 1プログラムに書き込まれています。

scanf次のようなものに渡す必要があります。

commandcommandある:

char command[2];
于 2013-06-09T01:16:20.963 に答える