这个实现有什么问题?

时间:2014-08-26 16:45:13

标签: c++ string

#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;
}

在运行此代码时,为什么不将字符串分成两部分?我想将具有偶数个字符的字符串分成两部分,但是当我打印输出时,它除了显示原始字符串外什么也没有显示。为什么会这样?

4 个答案:

答案 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)

正如其他人所指出的,您错过了ij的声明。您可能忘记将它们包含在已发布的代码中。我假设你有:

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)

由于未定义变量ij,因此不能编译此代码。

编辑:当您更新代码时,您可能不会使用带有空字符串ab的下标运算符。并且不需要使用终止零附加字符串。

代码可能看起来如下:

#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循环中再次变为零。