我只是编写程序。我尝试用指针制作它。从函数参数是没有索引的大写到小写的程序。问题在于价值的变化,我的程序正在崩溃......
#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);
不是一个好方法吗?
答案 0 :(得分:2)
这是C ++代码,所以:
char * nap = "aBCDEFGHI";
应该是
const char * nap = "aBCDEFGHI";
因为字符串文字在C ++中是const。所以你的代码:
*nap = (char)(*nap+32);
也是未定义的行为,可能导致崩溃。
删除UB的最小变化是将nap
定义为数组:
char nap[] = "aBCDEFGHI";
答案 1 :(得分:2)
你的编译器应该抱怨这一行...
char * nap = "aBCDEFGHI";
您的主要问题是您正在尝试在运行时修改字符串文字。它的Undefined Behavior是这样做的。见Why is this string reversal C code causing a segmentation fault?
此answer解释了您的解决方法。
你能告诉我为什么
*nap = (char)(*nap+32);
不是一个好方法吗?
本身并不是那么糟糕。但你可能会遇到麻烦...这条线是有效的......
*nap = *reinterpret_cast<char*>(const_cast<char*>(nap+32));
C风格的演员是一个无情的演员。正如您所看到的,您还丢弃了所有const
和/或volatile
条件......有些代码库会受到损害,特别是如果对象存储在只读标记的内存中。 ..见When should static_cast, dynamic_cast, const_cast and reinterpret_cast be used?