我一直在做一些C++的挑战来进入编码,当我试图创建一个反向字符串的函数时,我遇到了这个问题。 由于某种原因,将result[i]分配给str[str.length()-i]不能工作,但是将str[str.length()-i]分配给holding,然后将holding分配给result[i]可以工作。 有人能解释一下吗?
//this works
std::string reverse(std::string str){
std::string result;
char holding;
for(uint i = 0; i <= str.length(); i++){
holding = str[str.length() - i];
result += holding;
}
return result;
}
//this doesn't
std::string reverse(std::string str){
std::string result;
for(uint i = 0; i <= str.length(); i++){
result[i] = str[str.length() - i];
}
return result;
}
result
的大小为0。 访问result[i]
几乎在所有情况下都会导致未定义的行为。 您可以使用以下命令预先分配所需的内存
std::string reverse(std::string str){
std::string result(str.length(), '\0');
for(uint i = 0; i < str.length(); i++){
result[i] = str[str.length() - i - 1];
}
return result;
}
result
是空字符串。 分配result[0]='\0'
以外的任何内容都将具有未定义的行为。
但是将str[str.length()-i]分配给holding,然后将holding分配给result[i]就可以了。
在工作示例中,您没有给result[i]
赋值。 它之所以能工作,是因为您使用复合赋值运算符+=
,而不是赋值不存在的字符,该运算符执行串接到字符串末尾的操作。
附注。 标准库中有一个用于反转的函数。 或者您可以使用反向迭代器。
result
的长度为0。 请使用调整大小
函数或如下所示:
std::string reverse(std::string str){
std::string result = str; // temp value
for(uint i = 0; i <= str.length(); i++){
result[i] = str[str.length() - i];
}
return result;
}