为什么在写入字符串文字时scanf无法正常工作?

时间:2012-02-15 10:07:59

标签: c scanf

include<stdio.h>
int main()
{
    //char b[10];
    char *a="goodone";
    //a=b;

    scanf("%s",a);//this scanf fails and thow segmentation fault.
    printf("%s",a);

} 

为什么这不起作用?我用这个scanf试了很多但是,当我为我的变量保留内存a *(通过指定a = b(注释))它工作正常。否则它没有。 我相信char * a会为其字符串(“goodone”)分配一些内存,并将该内存位置返回其值。和printf一起工作正常,为什么scanf没有? 请救我脱离这个......

2 个答案:

答案 0 :(得分:2)

这是因为您指示scanf将其读取的数据写入为const char*值分配的内存中,即写入只读内存。

如果您想使字符串保持可写,请更改

char *a="goodone";

char a[]="goodone";

请注意,这也不安全:当用户输入超过七个字符时,它可能会崩溃。为格式说明符添加限制以解决该问题:

scanf("%7s",a);

P.S。注释掉的a=b工作正常,因为它没有修改字符串常量;相反,它将指针修改为字符常量, 允许。

答案 1 :(得分:1)

char *a只是指向char的指针。当您为其分配"goodone"时,它指向该字符串文字(只读),而scanf会尝试覆盖内存中导致崩溃的字符串。

如果为其分配b,则a指向可写内存区域10 char s(即最大长度为9的字符串+终止NUL) 。所以只要scanf没有存储比那里更长的东西,它就会起作用。

同样,您可以使a成为数组而不是指针(即char a[] = "goodone";)。再次,你需要注意不要在那里存放更长的东西。