提问者:小点点

为什么我不能将一个字符串的索引位置分配给另一个字符串的索引位置,但是我可以将它分配给一个中间字符呢?


我一直在做一些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;
}   

共3个答案

匿名用户

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;
}