在下面的代码中,反转字符串的长度被返回为零,但情况并非如此:
int main() {
string for_reversal;
string reversed;
int i,j,length, r_length;
cout << "Enter the string : n";
cin >> for_reversal;
cout << "Entered string is : " << for_reversal <<"n";
cout << "String length is : " << for_reversal.length() << "n";
length = for_reversal.length();
for (i=0; i<=length; i++)
{
reversed[i] = for_reversal[length - i-1];
cout << for_reversal[length-i] << "t";
}
reversed[length+1]=' ';
cout << "n";
r_length = reversed.length();
cout << "Reversed String length is : " << r_length << "n";
cout << "Reversed String is : " << reversed;
return 0;
}
不确定这里出了什么问题。
长度为length
的字符串中有length
个有效字符。在您的循环中,您访问索引为length
的元素,该元素超出了字符串的范围,这将调用未定义的行为。
此外,不能将值分配给字符串中超出其当前大小的单元格,而在适当调整字符串大小之前,可以将值分配到reversed
中的单元格。这将导致第二个未定义的行为。
考虑到我上面提到的两个问题,你的问题的行为真的没有定义。然而,如果我们忽略这一点,那么输出是有意义的——您将for_reversal[length]
的值赋值给reversed[0],这可能是' '
。因此,reversed
的长度现在是0。
更改
reversed[i] = for_reversal[length - i-1];
至
reversed+=for_reversal[length - i-1];
你这样做的方式是从束缚中获取字符串,为各种地狱般的突破铺平道路。上面提出的方法将把东西附加到字符串中,根据需要保留空间。
您可以尝试在"reversed"中保留空间(http://www.cplusplus.com/reference/string/string/reserve/)因此它可以保存原始字符串(reverse.reserve(for_reversal.size((((。
无论如何,请不要说您没有为\0字符保留空间。保留一个更大的字符串,或者用+运算符追加\0。
问题就在这里:
for (i = 0; i <= length; i++) {
reversed[i] = for_reversal[length - i-1];
// ...
}
附带声明:
reversed[i]
实际上,您正在尝试访问字符串的第i个元素,其中i=0,1。。。,长度。
但此时,对象字符串reversed
是一个空字符串。事实上,你已经用创建了它
string reversed;
这是默认构造函数,用于初始化空字符串。
换句话说,reversed[i]
访问未定义的内存位置,因为reversed
是空的,并且字符串中没有第i个位置。
解决方案
为了反转字符串,您可能会发现以下代码很有用:
std::string reversed;
for(auto rit = for_reversal.rbegin(); rit != for_reversal.rend(); ++rit) {
reversed.push_back(*rit);
}
这段代码应该比您的更安全,使用迭代器(在这种情况下是反向迭代器(。
备注
此外,不需要在末尾附加' '
字符,因为类string
已经处理了这一点。
程序有未定义的行为,因为字符串reversed
为空
string reversed;
并且您不能使用下标运算符
reversed[i] = for_reversal[length - i-1];
^^^^^^^^^^^
为字符串赋值。
此外,不需要将零字符附加到类型为std::string
的对象。
考虑到在环
for (i=0; i<=length; i++)
{
reversed[i] = for_reversal[length - i-1];
cout << for_reversal[length-i] << "t";
}
那么i
等于length
,那么你就会有
reversed[length] = for_reversal[-1];
^^^^^
创建反向字符串的最简单方法是以下
#include <iostream>
#include <string>
int main()
{
std::string for_reversal;
std::cout << "Enter the string: ";
std::cin >> for_reversal;
std::string reversed( for_reversal.rbegin(), for_reversal.rend() );
std::cout << "nReversed String length is : " << reversed.length() << "n";
std::cout << "Reversed String is : " << reversed << std::endl;
return 0;
}
程序输出为
Enter the string: Hello
Reversed String length is : 5
Reversed String is : olleH
如果您想自己编写循环,那么您应该在反向字符串中保留足够的内存,或者如果字符串最初为空,则至少使用成员函数push_back
而不是下标运算符。例如,程序可以按照以下方式查找
#include <iostream>
#include <string>
int main()
{
std::string for_reversal;
std::string reversed;
std::cout << "Enter the string: ";
std::cin >> for_reversal;
reversed.reserve( for_reversal.length() );
for ( std::string::size_type i = for_reversal.length(); i != 0; i-- )
{
reversed += for_reversal[i-1];
}
std::cout << "nReversed String length is : " << reversed.length() << "n";
std::cout << "Reversed String is : " << reversed << std::endl;
return 0;
}
程序输出将与上述相同
Enter the string: Hello
Reversed String length is : 5
Reversed String is : olleH
first initialize string reversed with empty string i.e string reversed="";
after this change for loop:
for(int i=0;i<length;i++)
{
reversed+=for_reversal[length-1-i];
cout << for_reversal[length-i] << endl;
}
int r_length=reversed.length();
cout << "reversed string length : " << r_length << endl;
cout << "Reversed string is : " << reversed << endl;
希望你能理解。