删除所有大写/小写的单词.c++

Removing words that are all uppercase/lowercase. C++

本文关键字:单词 c++ 删除      更新时间:2023-10-16

程序读取一个文件,如果用户添加一个参数大写或小写,它将删除全大写或全小写的单词。

ie。"你好世界……你好世界hello world "

'upper word'将输出"Hello World.... .... "hello world"
'lower word'将输出"Hello World.... "你好世界"

到目前为止,我的代码确实去掉了大写单词,但假设只有在后面的字符不是大写的情况下才会中断循环。

问题是,如果它是一个像"AABBaabb"这样的字符串,程序应该忽略它,因为有大小写混合。相反,它将打印"Baabb"。

函数是这样的

for (int i = 0; i < copyText.length(); i++)
{
   if (!ispunct(copyText[i]) || !isspace(copyText[i]))
   {
      while (isupper(copyText[i]) || isdigit(copyText[i]))
      {
         if (islower(copyText[i + 1]))
         {
            break;
         }
         else
            copyText.erase(copyText.begin() + i);
      }
   }
}

首先,第一个if语句中的条件总是求值为True。!(not)将首先应用,所以这个条件本质上是"如果它不是标点符号或者不是空格。"因为它不能同时是标点和空格,所以这总是正确的。我认为你要做的是检查这个字符是不是标点符号或空格以外的东西。你可以这样做

if(!(ispunct(copyText[i]) || isspace(copyText[i])))

或。

if(!ispunct(copyText[i]) && !isspace(copyText[i]))

while循环所做的是,只要copyText[i]是大写或数字,如果下一个字符- copyText[i + 1] -是小写,则中断,否则删除当前字符。这就是为什么它在开始删除之前不看单词的其他部分。这是你的算法的修改版本,它可能工作,也可能不工作(我还没有测试过),但它显示了我将如何开始修改你的方法,使其功能。

for (int i = 0; i < copyText.length(); i++)
                {
                    while (!ispunct(copyText[i]) && !isspace(copyText[i]))
                    {
                        bool delChar = True;
                        for (int j = 1; i+j < copyText.length(); j++) {
                            if (ispunct(copyText[i+j]) || isspace(copyText[i+j])
                                break;
                            if (islower(copyText[i+j]))
                                delChar = False;
                            }
                        if (delChar)
                            copyText.erase(copyText.begin() + i);
                    }
                }

现在,如果这是我想要的,它将解决你的问题,但它仍然不是在所有情况下工作。例如,考虑单词"aabbAABB"。算法将从第一个大写字母开始读取,一直读到末尾,然后决定删除该字符。你将只剩下"aabb"。您可以添加另一个内部for循环,从当前字符向后读取,以防止这种情况。

编辑:将if语句更改为while循环,因为我忘记了删除一个字符对其他字符的索引的影响。

您可以执行以下步骤:

  1. std::regex_iterator按模式\w+收集单词。Std::match_results存储位置&匹配长度。
  2. std::all_of + std::isupper/std::islower检测大小写单词
  3. std::basic_string::erase逐个删除单词(每次删除后不要忘记更新位置偏移量)。