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