替换char中的字符*

时间:2016-08-06 07:50:50

标签: c++

如何替换char *中的字符?

例如:

int main() {
    char* hello = "hello";
    int i;

    for (i = 0; i < 5; i++) {
        hello[i] = 'a';
    }
   cout << hello;
}

根本没有输出。只是暂停我并说程序没有响应。

预期输出:aaaaa

3 个答案:

答案 0 :(得分:3)

这里的问题是你有一个指向字符串文字的指针,而C ++中的字符串文字是常量字符数组。尝试修改常量数据会导致未定义的行为

您可以通过使hello成为数组来解决此问题:

char hello[] = "hello";

答案 1 :(得分:2)

char* hello = "hello";应为char hello[] = "hello";

前者是一个不允许更改的字符串文字。后者是一个数组,您可以从中更改其中的任何字符。

答案 2 :(得分:0)

<强>原因:

  

char * hello =&#34;你好&#34 ;;

实际上这是一个字符串文字,链接器存储了这个&#34;你好&#34;字符串在程序的单独内存部分称为只读存储区(检查链接器生成的内存映射文件(可能是.map扩展名)以查看程序内存映射)。

  

char * hello

hello是一个指针变量,它将存储在程序的堆栈区域中。

现在指针变量 hello 保留只读存储器的地址(字符串文字的基址)。

for (i = 0; i < 5; i++) {
    hello[i] = 'a';
}

您正在尝试修改只读内存,在这种情况下,它取决于操作系统它生成的异常(在某些情况下,您也会发现分段错误)。

<强>解决方案:

在堆栈上定义数组(本地到函数)或数据存储器(全局)。

char hello[] = "hello";

对于上面的约定,链接器将映射字符串&#34; hello&#34;在堆栈上(本地到函数)或数据存储器(全局)。

<强>建议 使用关键字 const 如果使用字符串文字以避免意外修改只读内存,通过定义 const 编译器将指示代码的任何部分是否正在尝试修改读取只有区域。

const char* hello = "hello";

请阅读以下内容。

  

来自C99标准6.4.5 / 5&#34;字符串文字 - 语义&#34;:

     

在转换阶段7中,附加值为零的字节或代码   每个由字符串文字产生的多字节字符序列   或文字。然后使用多字节字符序列   初始化一个静态存储持续时间和长度的数组   足以包含序列。对于字符串文字,   数组元素的类型为char,并使用   多字节字符序列的各个字节;对于宽弦   文字,数组元素具有类型wchar_t,并被初始化   用宽字符序列......

     

未指明这些数组是否与它们不同   元素具有适当的值。 如果程序尝试   修改这样的数组,行为是未定义的。