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

时间:2014-10-31 22:17:40

标签: c pointers strcpy string-literals

我想做一些简单的事情但是我已经在这方面做了很长时间。我有一个字符串,总是以特定的“标记”结束。在“++”下面的情况下。我想用更短的令牌替换结束令牌,让我们说“#”。

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);
}

2 个答案:

答案 0 :(得分:2)

问题是thing是一个字符串文字。你可以用这个:

char thing[]="ssssssssssssssss++";

将分配为所需的空间(编译器将自动计算出数组的大小)。

我用google搜索字符串文字失败的原因。我找到了一个我忘记的例子。 Here它是。

它几乎归结为:

  

字符串文字无法修改其数据,但可以修改其指针。另一方面,如果你有一个阵列,那么相反的情况就是如此。您无法修改指针,但可以修改数据。

     

一个有趣的评论是:“字符串文字有一个类型。这是char的数组。虽然你说“字符串文字不能修改它们的数据,但它们可以修改它们的指针”,但我的主要问题是它们没有你暗示的指针。指针和字符串文字实际上是分开的东西。“

答案 1 :(得分:2)

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

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

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

char thing[]="ssssssssssssssss++";

(数组和指针不完全相同......)