C++ 替换字符中的字符*
如何替换char*中的字符 例如:C++ 替换字符中的字符*,c++,C++,如何替换char*中的字符 例如: int main() { char* hello = "hello"; int i; for (i = 0; i < 5; i++) { hello[i] = 'a'; } cout << hello; } intmain(){ char*hello=“hello”; int i; 对于(i=0;i
int main() {
char* hello = "hello";
int i;
for (i = 0; i < 5; i++) {
hello[i] = 'a';
}
cout << hello;
}
intmain(){
char*hello=“hello”;
int i;
对于(i=0;i<5;i++){
你好[i]=“a”;
}
coutchar*hello=“hello”
应该是char hello[]=“hello”
前一个字符串是不允许更改的字符串。后者是一个可以更改其中任何字符的数组。
这里的问题是,您有一个指向字符串文字的指针,而C++中的字符串文字是字符的常量数组。试图修改常数数据会导致未定义的行为。
您可以通过制作hello
数组来解决此问题:
char hello[] = "hello";
原因:
char*hello=“hello”
实际上,这是一个字符串文本,链接器将这个“hello”字符串存储在程序的一个单独的内存部分,称为只读内存区域(检查链接器生成的内存映射文件(可能是.map扩展名)以查看程序内存映射)
你好
hello是一个指针变量,它将存储在程序的堆栈区域
现在指针变量hello保持只读内存的地址(字符串文本的基址)
对于上述约定,链接器将在堆栈(函数的本地)或数据内存(全局)上映射字符串“hello”
建议
如果使用字符串文字来避免意外修改只读内存,则使用关键字const。如果代码的任何部分试图修改只读区域,编译器将通过定义const抛出一个指示
const char* hello = "hello";
阅读下面的内容
来自C99标准6.4.5/5“字符串文字-语义”:
在翻译阶段7中,将值为零的字节或代码附加到
由字符串文字产生的每个多字节字符序列
或文字。然后使用多字节字符序列
仅初始化静态存储的持续时间和长度数组
足以包含序列。对于字符串文字
数组元素的类型为char,并使用
多字节字符序列的单个字节;用于宽字符串
在文本中,数组元素的类型为wchar\u t,并且已初始化
用宽字符序列
未指定这些数组是否不同,前提是它们的
元素具有适当的值。如果程序尝试
修改这样一个数组,行为是未定义的。
如果打开编译器警告,它应该能够检测类似这样的错误(以及许多其他错误)。不能替换char*
中的字符;可以替换char
数组中的字符。char*
通常是指向char
数组第一个元素的指针。
char hello[] = "hello";
const char* hello = "hello";