【问题标题】:Insert spaces to break up even sets of characters within a C++ String插入空格以分隔 C++ 字符串中的偶数组字符
【发布时间】:2011-10-05 15:27:23
【问题描述】:

我正在尝试编写一个函数,该函数将在字符串中查找任何偶数字符子集,并通过在字符串中插入一个空格将它们分成两半。例如,给定字符串“AA BBB CCDD”,我的字符串应该转换为“A A BBB CC DD”。

我的 breakString() 函数似乎不起作用,我不知道为什么。有人可以帮忙吗?

void breakString(string &str1)
{
    int pos1 = -1;
    int pos2 = str1.find_first_of(" ", pos1+1);

    while (pos2 != -1)
    {
        if(((pos2-pos1)-1)%2 == 0)
        {
            str1.insert((pos2-pos1)/2, 1, ' ');
            return;
        }
        else
        {
            pos1 = pos2;
            pos2 = str1.find_first_of(' ', pos1+1);
        }
    }

    if((str1.size() - pos1)%2 == 1)     
        str1.insert((str1.length()-pos1)/2, 1, ' ');

    return;
}

【问题讨论】:

  • 您好,@user,欢迎来到 Stack Overflow!这是一个学习练习吗?如果是这样,请将其标记为“作业”。
  • 那些-1应该是string::npos
  • 凯莉你好,欢迎来到堆栈溢出!这是寻求帮助时的提示。通常,写“它不起作用”的信息量不是很大。它可能意味着各种各样的事情(不编译、崩溃、不产生正确的输出)。准确描述您的问题有助于我们为您提供帮助。
  • 嗨 K-ballo,我有“while (pos2 != str1.npos)”,但是当我使用 F10 单步执行程序时,它显示 pos2 等于 -1,而不是npos,所以我将代码更新为-1。我刚试过改回str1.npos,还是不行。
  • 嗨,安德烈,感谢您的建议 - 这是有道理的!

标签: c++ string break


【解决方案1】:

你说它不起作用,但你没有说如何。我可以立即看到两个 问题:第一个是当你找到第一个时你立即返回 长度均匀的单词,因此您显然不会破坏任何后续 字;第二个是如果你想继续,insert 将更改其后任何位置的值。

(FWIW:我可能会先将整个字符串分解成单词, 将它们放在std::vector<std::string> 中,然后对其进行迭代, 在需要的地方插入额外的空间,然后重新组装它们。它是 可能比您使用的方法慢一点,但它很多 更干净,更容易理解。)

【讨论】:

    【解决方案2】:

    你的 while 循环中有一个 return,所以在第一次插入后,它将退出函数。

    【讨论】:

    • 嗨,John,我正在从我的主程序执行的 while 循环中调用 breakString() 函数,直到我的 checkForEvenSubsets() 返回“false”,所以我认为“return”在这里是可以的。我尝试从代码中删除它,但我仍然收到相同的错误(这是我的 main 函数中的无限循环)。
    【解决方案3】:
    void breakString(string &str1){
        string::size_type pos1 = 0;
        string::size_type pos2 = str1.find_first_of(" ");
    
        while (pos2 != string::npos){
            if((pos2 - pos1) % 2 == 0){
                str1.insert(pos1 + (pos2-pos1)/2, 1, ' ');
                pos2 += 1;
            }
    
            pos1 = str1.find_first_not_of(" ", pos2);
            pos2 = str1.find_first_of(" ", pos1);
        }
    
        if((str1.size() - pos1) % 2 == 0)     
            str1.insert(pos1 + (str1.size() - pos1)/2, 1, ' ');
    
        return;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-01
      • 2012-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      相关资源
      最近更新 更多