对于C++程序,字符串的length()返回0



在下面的代码中,反转字符串的长度被返回为零,但情况并非如此:

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;

希望你能理解。

最新更新