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 并将 a 附加watch到结构上,似乎在scanf函数内部,似乎“修改”了结构?这很奇怪,因为即使在scanf示例函数' fn'内部之后,它也能够很好地打印出结构字段。但是,一旦从 中返回fn并跳回到main中,当它尝试打印出相同的信息时会出现段错误?

有趣的是,如果您将其更改scanfscanf("%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 回答