[英]How to change value in array with pointer?
我只是编写程序。 我尝试使用指针来实现。 它是不使用函数参数索引而将大写字母更改为小写字母的程序。 问题在于更改值,我的程序在那崩溃了...
#include <iostream>
#include <cstring>
using namespace std;
char* male(char* nap, int n) {
for (int i = 0; i < 9; ++i) {
if (i != n && ((*nap >= 'A') && (*nap <= 'Z'))) {
*nap = (char)(*nap+32);
}
nap++;
}
return nap;
}
int main() {
char * nap = "aBCDEFGHI";
male(nap, 2);
return 0;
}
你能告诉我为什么*nap = (char)(*nap+32);
这不是一个好方法吗?
这是C ++代码,因此如下所示:
char * nap = "aBCDEFGHI";
应该
const char * nap = "aBCDEFGHI";
因为字符串文字在C ++中是const。 所以你的代码:
*nap = (char)(*nap+32);
也是不确定的行为,可能导致崩溃。
删除UB的最小更改是将nap
定义为数组:
char nap[] = "aBCDEFGHI";
您的编译器应该抱怨这一行...
char * nap = "aBCDEFGHI";
您的主要问题是您试图在运行时修改字符串文字。 这样做的不确定行为 。 请参阅为什么此字符串反转C代码导致分段错误?
此答案说明了您的解决方法。
你能告诉我为什么
*nap = (char)(*nap+32);
这不是一个好方法吗?
它本身并没有那么糟糕。 但是您可能会遇到麻烦...这条线实际上是...
*nap = *reinterpret_cast<char*>(const_cast<char*>(nap+32));
C型演员表是无情的演员表。 如您所见,您还抛弃了所有const
和/或volatile
限定条件。...有些代码库会受到损害,尤其是如果对象存储在只读标记的内存中……请参阅何时应使用static_cast,dynamic_cast ,使用const_cast和reinterpret_cast吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.