对于C ++程序,string的length()返回0

时间:2016-09-01 12:29:57

标签: c++ string algorithm reverse

在下面的代码中,反向字符串的长度返回为零,不应该是这种情况:

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]='\0';
cout << "\n";

r_length = reversed.length();
cout << "Reversed String length is : " << r_length << "\n";
cout << "Reversed String is : " << reversed;

return 0;
}

不确定这里出了什么问题。

5 个答案:

答案 0 :(得分:0)

字符串中有length个有效字符,长度为length。在您的循环中,您将访问索引为length的元素,该元素超出字符串的范围,这会调用未定义的行为

此外,您无法为字符串中超出当前大小的单元格指定值,而在适当调整字符串大小之前为reversed中的单元格指定值。这导致第二个未定义的行为

考虑到我上面提到的两个问题,你的问题的行为确实没有定义。但是,如果忽略这一点,输出确实有意义 - 您将for_reversal[length]的值赋予reverse [0],这可能是'\0'。因此,reversed的长度现在为0.

答案 1 :(得分:0)

更改

    apply plugin: 'com.android.application'

android {
    useLibrary 'org.apache.http.legacy'
    compileSdkVersion 'Google Inc.:Google APIs:23'
    buildToolsVersion '23.0.3'

    defaultConfig {
        applicationId "package-name"
        minSdkVersion 11
        targetSdkVersion 21
        compileOptions {
            sourceCompatibility JavaVersion.VERSION_1_7
            targetCompatibility JavaVersion.VERSION_1_7
        }
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        }
    }
}

dependencies {

    compile 'org.apache.httpcomponents:httpclient-android:4.3.5'
    compile('org.apache.httpcomponents:httpmime:4.3.6')
    compile files('libs/universal-image-loader-1.8.0.jar')
    compile files('libs/zxing-1.7-core.jar')
    compile files('libs/zxing-integration.jar')
    compile files('libs/gcm.jar')
    compile 'com.google.android.gms:play-services:9.4.0'
    compile 'com.android.support:appcompat-v7:23.2.0'
}

reversed[i] = for_reversal[length - i-1];

你正在这样做的方式是从它的界限中访问字符串,为各种地狱突破铺平了道路。上面提出的方法会将东西附加到字符串中,根据需要保留空间。

您可以尝试在&#34;反转&#34;中预留空间(http://www.cplusplus.com/reference/string/string/reserve/)所以它可以保存原始字符串(reversed.reserve(for_reversal.size()))。

在任何情况下,请注意,您没有为\ 0字符保留空间。保留更大的字符串或使用+运算符附加\ 0。

答案 2 :(得分:0)

程序具有未定义的行为,因为字符串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

答案 3 :(得分:0)

问题在于:

for (i = 0; i <= length; i++) {
  reversed[i] = for_reversal[length - i-1];
  // ...
}

声明:

reversed[i]

您实际上是在尝试访问字符串的 i-th 元素, i = 0,1,...,length

但此时,对象字符串reversed空字符串。确实,你已经创建了它:

string reversed;

这是默认构造函数,用于初始化字符串。

换句话说,reversed[i]访问未定义的内存位置,因为reversed无效,并且没有 i-th 位置字符串。

解决方案

为了反转字符串,您可能会发现此代码很有用:

std::string reversed;

for(auto rit = for_reversal.rbegin(); rit != for_reversal.rend(); ++rit) {
  reversed.push_back(*rit);
}

使用迭代器(在这种情况下为reversed iterator),此代码应该更安全。

注意

此外,不需要在最后添加'\0'字符,因为类string已经处理过了。

答案 4 :(得分:0)

 $(document).ready(function() {

 $('#example').DataTable();

 $(".dataTables_length label select").change(function(){
  alert(this.value);
 });

});
希望你明白。