2015-09-28 83 views
1

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

即。 “Hello World ....你好世界....你好世界”

'upper word'会输出“Hello World .... .... hello world”
'lower word'would output“Hello世界....你好世界....“

截至目前为止我的代码确实脱掉了大写字母,但假定只有在下面的字符不是大写字母时才会断开循环。

问题是,如果它的字符串像“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); 
     } 
    } 
} 
+0

我不明白示例输入和预期输出。 –

+0

哦,对不起。这只是该计划的一部分。还有其他功能。 copyText是txt文件(它是输入)的副本,输出在最后是一个cout。所以它不会直接改变txt文件,只是临时的copyText。 – Nate

+0

'std :: regex_replace(copyText,std :: regex {“\\ b [AZ] * \\ b”},“”);' – user657267

回答

1

首先,第一个if语句中的条件总是计算为True。 !! (不)将首先被应用,所以条件基本上是“如果它不是标点或它不是空格”。既然它不能既是标点又是空格,这总是如此。我认为你想要做的是检查角色是否是标点符号或空格以外的东西。你可以这样做

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”。您可以添加另一个内循环来从当前字符向后读取,以防止出现这种情况。

编辑:如果语句改为while循环,因为我忘记了删除其他字符的索引上的字符的效果。

+0

我得到它的逻辑,谢谢,但是我得到了一个“下标范围“,我希望能弄清楚。并感谢您指出|| &&问题。 – Nate

+0

啊,这可能是因为内循环。尝试拉动copyText [i + j]而不检查i + j

0

你可以做以下步骤:

  1. std::regex_iterator通过模式\\w+收集的话。 std::match_results店铺位置&比赛时长。
  2. std::all_of + std::isupper/std::islower检测大写/小写字。
  3. std::basic_string::erase逐个删除单词(不要忘记每次删除后更新位置偏移量)。
+0

这个选项也在我脑海中激荡。我想计算大写字母,然后计算有多少字母,然后比较,如果它们是相同的删除子字符串。只是无法弄清楚语法。谢谢! – Nate