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

vim*_*lpt 5 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);

} 
Run Code Online (Sandbox Code Playgroud)

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

das*_*ght 2

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

如果您想让字符串常量可写,请更改

char *a="goodone";
Run Code Online (Sandbox Code Playgroud)

char a[]="goodone";
Run Code Online (Sandbox Code Playgroud)

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

scanf("%7s",a);
Run Code Online (Sandbox Code Playgroud)

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

  • 为了强调这一点,*永远不要*将 `scanf()` 与裸露的 `%s` 格式一起使用。无论您提供多大的缓冲区,都无法阻止用户输入足够的字符以使其溢出。它与“gets()”一样不安全(也不应该使用它)。 (2认同)