删除全部为大写/小写的单词。 C ++

时间:2015-09-28 01:35:38

标签: c++ uppercase

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

即。 “Hello World .... HELLO WORLD .... hello world”

'上面的单词'会输出“Hello World .... .... hello world”
'低级字'将输出“Hello World .... 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);
      }
   }
}

2 个答案:

答案 0 :(得分:1)

首先,第一个if语句中的条件将始终求值为True。的! (不)将首先应用,因此条件基本上是“如果它不是标点符号或它不是空格”。由于它不能同时是标点符号和空格,因此总是如此。我认为你要做的是检查角色是否是标点符号或空格以外的东西。你可以这样做

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

或者这个。

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

你的while循环正在做的是,只要copyText [i]是大写或数字,如果VERY NEXT字符 - 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 :(得分:0)

您可以执行以下步骤:

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