为什么我不能将一个字符串的索引位置分配给另一个字符串的索引位置,但我可以将它分配给一个中间字符? 我一直在做一些C++的挑战来进入编码,当我试图创建一个函数来反转一个字符串时,我遇到了这个问题。出于某种原因,将结果[i]分配给str[str.length-i]不起作用,但将str[str.length-i]分配给holding,然后再将holding分配给结果[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; }

为什么我不能将一个字符串的索引位置分配给另一个字符串的索引位置,但我可以将它分配给一个中间字符? 我一直在做一些C++的挑战来进入编码,当我试图创建一个函数来反转一个字符串时,我遇到了这个问题。出于某种原因,将结果[i]分配给str[str.length-i]不起作用,但将str[str.length-i]分配给holding,然后再将holding分配给结果[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; },c++,string,for-loop,C++,String,For Loop,结果是一个空字符串。分配除结果[0]='\0'以外的任何内容都将具有未定义的行为 但是将str[str.length-i]赋值给holding,然后将holding赋值给result[i]就可以了 在工作示例中,您没有为结果[i]赋值。它之所以有效,是因为您使用复合赋值运算符+=而不是赋值一个不存在的字符,该运算符将串接到字符串的末尾 另外,标准库中有一个用于反转的函数。或者您可以只使用反向迭代器。结果是一个空字符串。分配除结果[0]='\0'以外的任何内容都将具有未定义的行为 但是将str[s

结果是一个空字符串。分配除结果[0]='\0'以外的任何内容都将具有未定义的行为

但是将str[str.length-i]赋值给holding,然后将holding赋值给result[i]就可以了

在工作示例中,您没有为结果[i]赋值。它之所以有效,是因为您使用复合赋值运算符+=而不是赋值一个不存在的字符,该运算符将串接到字符串的末尾

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

结果是一个空字符串。分配除结果[0]='\0'以外的任何内容都将具有未定义的行为

但是将str[str.length-i]赋值给holding,然后将holding赋值给result[i]就可以了

在工作示例中,您没有为结果[i]赋值。它之所以有效,是因为您使用复合赋值运算符+=而不是赋值一个不存在的字符,该运算符将串接到字符串的末尾

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

结果的大小为0。在几乎所有情况下,访问结果[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;
} 
结果的大小为0。在几乎所有情况下,访问结果[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;
} 
结果的长度为0。请使用调整大小功能或类似功能:

std::string reversestd::string str{ std::string result=str;//临时值 foruint i=0;i std::string reversestd::string str{ std::string result=str;//临时值 foruint i=0;i第二段代码不起作用,因为该字符串刚刚声明,并且仅对该字符串调用默认构造函数,并且根据文档,该字符串的默认大小为0,因此,在编写此lineresult[i]=str[str.length-i];正确的行应该是 结果[i]=str[str.length-i-1];您将收到明显的索引外错误,因为字符串大小为0..working code->


第二段代码不起作用,因为该字符串刚刚声明,并且仅对该字符串调用默认构造函数,并且根据文档,该字符串的默认大小为0,因此,在编写此lineresult[i]=str[str.length-i];正确的行应该是 结果[i]=str[str.length-i-1];您将收到明显的索引外错误,因为字符串大小为0..working code->


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

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

结果的大小为0。访问结果[i]导致未定义的行为。对C++进行一些C++挑战并不是学习C++的最佳方法。学习C++的最好方法,解释C++的这些基本规则。例如,本书将解释为什么将字符分配给空字符串的某个索引会导致崩溃,但+运算符重载实际上做了正确的事情,并增加了字符串的大小。这个解释只在C++教科书中找到,而不是毫无意义的在线编码竞赛网站。什么不起作用?这能回答你的问题吗?罗里:难道没有一个答案能回答你的问题吗
问题我这样问是因为你还没有一个,结果的大小是0。访问结果[i]导致未定义的行为。对C++进行一些C++挑战并不是学习C++的最佳方法。学习C++的最好方法,解释C++的这些基本规则。例如,本书将解释为什么将字符分配给空字符串的某个索引会导致崩溃,但+运算符重载实际上做了正确的事情,并增加了字符串的大小。这个解释只在C++教科书中找到,而不是毫无意义的在线编码竞赛网站。什么不起作用?这能回答你的问题吗?罗里:这些答案都没有回答你的问题吗?我这样问是因为您还没有找到其中一个。当I==str.length时,您将写入result[result.length]。未定义的行为。@Ted Lynmo我修复了它。当i==0时,代码生成未定义的行为,而不是i==str.length.Good-现在您的算法与Thomas Sabliks相同,只是他的初始化结果的方法可能更有效一些。关于UB:不,当我0岁的时候,唯一发生的事情是你从str[str.length]读到结果[0],没有一个是UB。当我是str.length时,您从str[0]读取ok并写入result[result.length],但结果[result.length]不正常-除非您写入不太可能的\0。当我==str.length时,您将写入result[result.length]。未定义的行为。@Ted Lynmo我修复了它。当i==0时,代码生成未定义的行为,而不是i==str.length.Good-现在您的算法与Thomas Sabliks相同,只是他的初始化结果的方法可能更有效一些。关于UB:不,当我0岁的时候,唯一发生的事情是你从str[str.length]读到结果[0],没有一个是UB。当我是str.length时,您从str[0]读取ok并写入result[result.length],但结果[result.length]并不ok-除非您写入不太可能的\0。当i==str.length时,您将从str[-1]读取并写入result[result.length],因此您的函数有两次未定义的行为。当i==str.length时,您将从str[-1]读取并写入结果[result.length]因此,函数有两次未定义的行为。