我正在玩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
,似乎在scanf
函数内,它似乎“修改”了结构?这很奇怪,因为即使在样本函数“scanf
”内部fn
之后,它也可以打印出结构字段。但是,一旦从fn
返回并跳回main
,它会在尝试打印相同信息时出现错误?
有趣的是,如果您将scanf
更改为scanf("%c\n", &command);
(没有字符集),它似乎工作正常。为了记录,我使用的gcc版本是4.7.2,我正在使用:gcc -O0 -o sample sample.c
编译代码。
我唯一想到的是gcc可能不支持字符集吗?我不确定。只是想知道是否有其他人可以解决这个问题?
答案 0 :(得分:6)
scanf("%[abc]", &command);
写一个字符串而不是一个字符。字符串的尾随空字符正在程序中的&command + 1
中写入。
你应该传递给scanf
之类的东西:
command
command
为:
char command[2];