我想做一些简单的事情但是我已经在这方面做了很长时间。我有一个字符串,总是以特定的“标记”结束。在“++”下面的情况下。我想用更短的令牌替换结束令牌,让我们说“#”。
strstr
返回NULL或指向初始结束标记的指针。
strcpy
应该从strstr
返回指针并用“#\ 0”覆盖“++”。
至少我认为应该这样做。相反,我得到一个“赋值从指针生成整数而没有强制转换”警告。此时我已尝试strcpy(*newThing, "#");
和其他一些事情。不给出错误的东西会导致段错误。
在这种情况下,C是从堆栈上的某些不可变空间获取原始字符串的存储空间吗?我需要使用其中一个“alloc”吗?我也试过了,但可能错过了什么。
#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);
}
答案 0 :(得分:2)
问题是thing
是一个字符串文字。你可以用这个:
char thing[]="ssssssssssssssss++";
将分配为所需的空间(编译器将自动计算出数组的大小)。
我用google搜索字符串文字失败的原因。我找到了一个我忘记的例子。 Here它是。
它几乎归结为:
字符串文字无法修改其数据,但可以修改其指针。另一方面,如果你有一个阵列,那么相反的情况就是如此。您无法修改指针,但可以修改数据。
一个有趣的评论是:“字符串文字有一个类型。这是char的数组。虽然你说“字符串文字不能修改它们的数据,但它们可以修改它们的指针”,但我的主要问题是它们没有你暗示的指针。指针和字符串文字实际上是分开的东西。“
答案 1 :(得分:2)
您的问题是thing
是一个指向字符串文字的指针。在过去,你可以这样做,但是当前的编译器将字符串文字存储在不可写的内存中。
因此,当您执行代码时,您将获得访问冲突写入位置(或等效消息)。
解决这个问题的最简单方法:声明一个用字符串文字初始化的自动数组,一切都很好:
char thing[]="ssssssssssssssss++";
(数组和指针不完全相同......)