c - 为什么 scanf 在写入字符串文字时没有按预期工作?

标签 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 不呢? 请救我脱离这个....

最佳答案

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

如果你想让你的字符串常量可写,改变

char *a="goodone";

char a[]="goodone";

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

scanf("%7s",a);

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

关于c - 为什么 scanf 在写入字符串文字时没有按预期工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9291348/

相关文章:

c++ - C/C++ 拼图 : To print values from 1. .15 15..1 带有一个 for 循环

c - 如何使用任意数量的 scanf() 格式说明符?

C 接受关于传递关系的输入

C 编程循环不会因 scanf!=0 而停止

c - 在 c90 中传递多维数组(VLA 之前的样式)

计算以下 C 代码中每个语句的频率计数

C标准: L prefix and octal/hexadecimal escape sequences

比较两个内存地址并显示它们相等

C fscanf 跳转值

c - 扫描整数的第 2 位数字