c - 用另一个字符串替换部分字符串会导致段错误

标签 c pointers strcpy string-literals

我想做一些简单的事情,但我已经为此苦苦思索了太久。我有一个总是以特定“标记”结尾的字符串。在“++”下方的情况下。我想用更短的标记替换结束标记,比方说“#”。

strstr 返回 NULL 或指向初始结束标记的指针。 strcpy 应该获取从 strstr 返回的指针并用“#\0”覆盖“++”。

至少这是我认为它应该做的。相反,我收到“赋值从指针生成整数而不进行强制转换”警告。我已经尝试了 strcpy(*newThing, "#"); 和其他一些东西。不给出错误的东西会导致段错误。

在这种情况下,C 是否正在从堆栈上的某个不可变空间中获取原始字符串的存储空间?我需要使用其中一个“分配”吗?我也试过了,但可能遗漏了一些东西。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main() {
    char *thing="ssssssssssssssss++";
    char *newThing;

    newThing = strstr(thing, "++");
    strcpy(newThing, "#");
    printf("%s\n", thing);

    exit(0);
}

最佳答案

你的问题是 thing 是一个指向字符串文字的指针。在过去,您可以这样做,但当前的编译器将字符串文字存储在不可写内存中。

因此,当您执行代码时,您会得到一个访问冲突写入位置(或等效消息)。

解决这个问题的最简单方法:声明一个自动数组用字符串文字初始化,一切都很好:

char thing[]="ssssssssssssssss++";

(数组和指针不完全一样...)

关于c - 用另一个字符串替换部分字符串会导致段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26684239/

相关文章:

c - USB OTG 外设 Linux 驱动程序问题(地址不同)

c++ - Visual Studio 2013 strcpy_s 和一个字的大小

c - 为什么应该使用 strncpy 而不是 strcpy?

c++ - C 程序 : Get inode header fields and information by inode number

c++ - 如何让 C 或 C++ 程序每 X 秒执行一次特定任务,但仍然在其间执行其他任务?

c++ - 如何制作一个容器来容纳任何类型的指针

c - 为什么我的程序 "creating index"不起作用?

c++ - 如何指示指针的 C++ 所有权

c - 如何更改 C 中预先存在的指针

c++ - 在 win2k3 上运行 .exe 时出现 "The procedure entry point GetErrorMode could not be located in the dynamic link library kernel32.dll"错误