2015-09-28 85 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