【问题标题】:Split a even-numbered string in c++在c ++中拆分偶数字符串
【发布时间】:2015-02-18 00:33:19
【问题描述】:

我对 C++ 很陌生。我正在尝试拆分包含偶数子字符串的字符串,直到没有偶数子字符串。例如,如果我输入 AB ABCD ABC,则输出应该是 A B A B C D ABC。我试图在没有令牌的情况下做到这一点,因为我不知道如何.. 到目前为止,我只拆分了第一个偶数子字符串,如果我只有一个子字符串,它就不起作用。有人可以帮我吗? 任何建议将不胜感激。谢谢!

string temp = "";    
void check(string &str, int &i, int &flag)
{
    int count = 0;
    int reminder;
    do
        {
            count++;
            temp += str[i];
            i++;        
        } while (str[i] != ' ');

    i = i - temp.size();

    reminder = count % 2;
    if (reminder == 0)
        flag = 1;
    else
        flag = 0;
}

void SplitEvenWord(string &str)
{
    int i = 0;
    int flag = 0;

    for (i = 0; i < str.size(); i++)
    {
        check(str, i, flag);
        if (flag == 1)
        {
            temp.insert(temp.size() / 2, " ");
            str.replace(i, temp.size() - 1, temp);
        }
    }

}

【问题讨论】:

  • 这里有两个功能。你测试过哪个?每个的输入和输出应该是什么,什么输入会导致它们出现故障?
  • @Beta,它将在 GUI 环境中运行并从文本框中获取输入。我一起测试了它们,因为第二个只在第一个为真时运行。所以在文本框中我会输入一个随机字符串,如 ABC ABCD 并期望输出 ABC A B C D

标签: c++ string split


【解决方案1】:

有两项技能在软件工程中绝对至关重要(嗯,不止两项,但目前只有两项):独立开发新功能,并以最简单的方式进行测试。

你说如果只有一个子字符串,代码就会失败。您没有说 如何 它失败了(我应该在列表中提到明确的错误报告)所以我不知道是否使用应该拆分的偶数长度字符串测试您的代码( "ABCD" => "A B C D") 或一个奇数长度的字符串,它应该不理会("ABC" => "ABC")。在我尝试编写这些代码之前,我先看看你的第一个函数:

void check(string &str, int &i, int &flag)
{
  ...
  do
    {
        count++;
        temp += str[i];
        i++;
    } while (str[i] != ' ');
  ...
}

已经麻烦了。我想到的字符串不包含任何空格,因此循环无法终止。这段代码将在字符串末尾运行到该内存空间中的任何内容,这将导致未定义的行为。(如果您不知道该术语,则意味着不知道是什么会发生,但如果你幸运的话,程序就会崩溃。)

解决这个问题,尝试在“ABC”和“ABCD”和“A”和“”和“ABC DEF”上运行该代码,并让它完美运行。完成后,请查看您的其他功能。不要用随机输入来测试它,用短的、明确定义的字符串来测试它。一旦它完美运行,尝试更长、更复杂的字符串。如果你发现一个导致它失败的字符串,抓住它!该字符串会导致您出现错误。

这应该足以让你开始。

【讨论】:

    【解决方案2】:

    我写这个是为了回答,因为它太长了,不适合作为评论。

    我有一些建议可以帮助您找出问题所在。

    1. 将“check”分成至少两个函数,一个用于将字符串拆分为单个单词并检查它们,另一个用于检查字符串的长度。
    2. 分别测试“检查”和“标记化”功能,看看它们是否给您预期的答案。单独处理它们,直到它们正确为止。
    3. 将“SplitEvenWord”中答案的格式分离到一个单独的函数中。
    4. “SplitEvenWord”应该只是调用您根据上述步骤创建的函数。

    当我遇到困难时,我总是尝试将问题分解为我知道我可以解决的小块。最终,问题变成了将解决方案的已经工作的部分组装成一个更大的函数来解决原始问题。

    【讨论】:

      猜你喜欢
      • 2014-01-05
      • 2021-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多