#include <iostream>
#include <string>
using namespace std;
int main (void)
{
int count = 0,i=0,j=0;
string str,a,b;
//a.reserve(100);
//b.reserve(100);
char ch;
cin>>str;
int length = str.size();
cout<<length<<"\n";
if ( length % 2 != 0 )
cout<<"-1"<<"\n";
else
{
while ( count < (length/2) )
{
a[j] = str[i];
j++,i++;
count++;
}
a[j] = '\0';
j = 0;
while ( count < length )
{
b[j] = str[i];
j++,i++;
count++;
}
b[j] = '\0';
cout<<a<<"\n";
cout<<b<<"\n";
cout<<str<<"\n";
}
return 0;
}
在运行此代码时,为什么不将字符串分成两部分?我想将具有偶数个字符的字符串分成两部分,但是当我打印输出时,它除了显示原始字符串外什么也没有显示。为什么会这样?
答案 0 :(得分:1)
此代码不会编译为i
,并且未定义j
。但你只想要这样的东西:
size_t len = str.size() / 2;
if (str.size() == len * 2) {
string a(str, 0, len);
string b(str, len, len);
// ...
}
答案 1 :(得分:1)
正如其他人所指出的,您错过了i
和j
的声明。您可能忘记将它们包含在已发布的代码中。我假设你有:
int i = 0;
int j = 0;
在分隔字符串的代码中,您有:
while ( count < (length/2) )
{
a[j] = str[i]; // NOT GOOD.
j++,i++;
count++;
}
通过分配给a[j]
,您正在访问超出范围的内存并调用未定义的行为。您可以将该代码块更改为:
while ( count < (length/2) )
{
a.push_back(str[i]);
j++,i++;
count++;
}
它应该有效。在上述行之后的while
块也是如此。你可以使用
while ( count < length )
{
b.push_back(str[i]);
j++,i++;
count++;
}
答案 2 :(得分:0)
由于未定义变量i
和j
,因此不能编译此代码。
编辑:当您更新代码时,您可能不会使用带有空字符串a
和b
的下标运算符。并且不需要使用终止零附加字符串。
代码可能看起来如下:
#include <iostream>
#include <string>
int main()
{
std::string s;
std::string t1, t2;
std::getline( std::cin, s );
if ( s.size() % 2 == 0 )
{
t1.reserve( s.size() /2 );
t2.reserve( s.size() /2 );
for ( std::string::size_type i = 0; i < s.size() / 2; i++ )
{
t1.push_back( s[i] );
t2.push_back( s[s.size()/2+i] );
}
std::cout << t1 << std::endl;
std::cout << t2 << std::endl;
std::cout << s << std::endl;
}
return 0;
}
如果输入为:
Hello world!
...然后输出将是:
Hello
world!
答案 3 :(得分:0)
运行相同程序时应该出现编译错误,i和j未在程序中的任何位置声明。
你应该在else范围内声明i和j,以便它们在while循环中保持相同,如果你声明它,while循环值在其他while循环中再次变为零。