在下面的代码中,反向字符串的长度返回为零,不应该是这种情况:
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;
}
不确定这里出了什么问题。
答案 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);
});
});
希望你明白。