Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 删除所有大写/小写的单词。C++;_C++_Uppercase - Fatal编程技术网

C++ 删除所有大写/小写的单词。C++;

C++ 删除所有大写/小写的单词。C++;,c++,uppercase,C++,Uppercase,程序读取一个文件,如果用户添加一个大写或小写参数,它将删除所有大写或小写的单词 比如“你好世界……你好世界……你好世界” “upper word”将输出“Hello World…….Hello World” “lower word”将输出“Hello World….Hello World….” 到目前为止,我的代码确实去掉了大写字母,但假设只有在以下字符不是大写字母时,它才会中断循环 问题是,如果它是一个类似“AABBaabb”的字符串,程序应该忽略它,因为它混合了大小写。相反,它将打印“Baa

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

比如“你好世界……你好世界……你好世界”

“upper word”将输出“Hello World…….Hello World”
“lower word”将输出“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);
      }
   }
}
for(int i=0;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);
                    }
                }
for(int i=0;i

现在,如果这是我想要的,它会解决你的问题,但是它在任何情况下都不会起作用。例如,考虑“Abababb”这个词。算法将开始读第一个大写字母,读到结尾,决定删除这个字符。你只剩下“AABB”。。您可以添加另一个内部for循环以从当前字符向后读取,以防止出现这种情况


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

您可以执行以下步骤:

  • 按模式收集单词
    \\w+
    。存储匹配的位置和长度
  • +/检测大小写单词
  • 逐个删除单词(不要忘记在每次删除后更新位置偏移)

  • 我不理解示例输入和预期输出。哦,抱歉。这只是程序的一部分。还有其他功能。copyText是txt文件(即输入)的副本,输出是结尾的一个cout。因此它不是直接更改txt文件,只是临时copyText。
    std::regex_替换(copyText,std::regex{\\b[A-Z]*\\b“},””;
    我知道了它的逻辑,谢谢,但我得到了一个“下标超出范围”,我很有希望能找到。谢谢你指出了| |&&问题。啊,那可能是因为内部for循环。尝试在不检查I+j