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

时间:2020-07-30 11:19:54

标签: c++ string for-loop

我一直在进行一些C ++挑战来进行编码,当我尝试创建一个反转字符串的函数时,我碰到了这一点。出于某种原因,将结果[i]分配给str [str.length()-i]不起作用,但是将str [str.length()-i]分配给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;
}   

5 个答案:

答案 0 :(得分:3)

result是一个空字符串。分配result[0] = '\0'以外的任何东西都将具有不确定的行为。

但是将str [str.length()-i]分配给保持,然后保持为result [i]。

在工作示例中,您没有分配给result[i]。之所以起作用,是因为您使用复合赋值运算符+=来执行串联操作,而不是分配不存在的字符。


P.S。标准库中有一个用于反转的函数。或者,您可以只使用反向迭代器。

答案 1 :(得分: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;
} 

答案 2 :(得分:0)

result的长度为0。请使用resize功能或类似方法:

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 - 1];
     }
     return result;
} 

答案 3 :(得分:0)

假设您来自javascript之类的语言,可以在其中分配数组的任何索引,系统将在后台为其获取内存。在这方面,C ++的自由度要低得多。您要么必须给字符串指定一个大小(以便保留内存),以便稍后将数据分配给每个索引,要么使用某种扩展字符串的方法(对它执行+ =时会调用此方法)。后面的情况每次都会重新获得新的内存,并复制从性能角度来看不理想的字符。

答案 4 :(得分:-1)

第二段代码不起作用,因为该字符串刚刚声明,并且仅对该字符串调用了默认构造函数,并且根据文档,该字符串的默认大小为0,因此在编写时此行
result[i] = str[str.length() - i];
(正确的行应为 result[i] = str[str.length() - i - 1];
您会收到索引不足错误,这很明显,因为字符串大小为0。
see this
工作代码-> < / em>

std::string reverse(std::string str){
     std::string result(str);
     for(uint i = 0; i < str.length(); i++){
         result[i] = str[str.length() - i-1];
     }
     return result;
}