2011-09-16 27 views
0

在學校任務中​​,我們被要求從字符串中刪除每個元音的出現。如何擦除字符串中每個元音的出現

所以說: 「男孩把球踢」會導致 「號由kckd日BLL」

每當一個元音被發現,所有的後續字符以某種方式有左移,或者至少這是我的做法。因爲我剛剛開始學習C,很可能這是一種荒謬的方法。

我想要做的是:當我點擊第一個元音時,我將下一個字符([i + 1])「轉移」到當前位置(i)。那麼對於每個後續字符都必須繼續移位,所以int startshift被設置爲1,所以第一個if塊在每次後續迭代中都會執行。

第一個if塊還測試以查看下一個字符是否爲元音。沒有這樣的測試,元音前面的任何字符都會「變換」到相鄰的元音,並且除第一個元音之外的每個元音仍然存在。然而,這導致每個元音被前面的char替代,因此if if塊被替換。

無論如何,這個醜陋的代碼是我到目前爲止提出的。 (用於字符*指針是沒有意義的名字(我只是不知道該怎麼稱呼他們),並具有兩組人可能是redudant。

char line[70]; 

char *blank; 
char *hlp; 

char *blanktwo; 
char *hlptwo; 


strcpy(line, temp->data); 

int i = 0; 
int j; 

while (line[i] != '\n') { 

    if (startshift && !isvowel(line[i+1])) { // need a test for [i + 1] is vowel 

blank = &line[i+1]; // blank is set to til point to the value of line[i+1] 
hlp = &line[i]; // hlp is set to point to the value of line[i] 

*hlp = *blank; // shifting left 

    } else if (startshift && isvowel(line[i+1])) { 

blanktwo = &line[i+1]; 
hlptwo = &line[i]; 

*hlptwo = *blanktwo; 

//*hlptwo = line[i + 2]; // LAST MOD, doesn't work 


    } 

    for (j = 0; j < 10; j++) { // TODO: j < NVOWELS 

if (line[i] == vowels[j]) { // TODO: COULD TRY COPY EVERYTHING EXCEPT VOWELS 
    blanktwo = &line[i+1]; 
    hlptwo = &line[i]; 

    *hlptwo = *blanktwo; 

    startshift = 1; 

} 

    } 

    i++; 

} 

printf("%s", line); 

的代碼不能正常工作。

用的text.txt:

The boy kicked the ball 
He kicked it hard 

./oblig1刪除test.txt的產生: 釷男孩把球踢

e kicked it hard 
注意

。我省略了用於迭代文本文件中行的外部while循環。

+0

很遺憾,您的代碼示例是不完整的;至少有一些功能簽名丟失。 –

+0

真的嗎?你什麼意思? –

回答

4

只是一些深思,因爲這是功課,我不想殺風景:

您也可以解決這個問題,在不使用第二「TEMP->數據」緩衝區。如果給定的輸入字符串是在修改內存塊,像

char data[] = "The boy kicked the ball"; 

你也可以寫一個程序,維護兩個指針到緩衝區:

  • 一個指針指向字符串,其中的位置下一個元音需要寫出來;每當元音被寫入時,這個指針就被提前。
  • 第二個指針指向字符串中要讀取的下一個字符的位置;只要讀取一個字符,這個指針就會被提前。

如果你考慮一下,你會發現第一個指針不會像第二個指針那樣快速前進(因爲每個字符都被讀取,但並非每個字符都被寫出 - 元音被忽略)。

如果您選擇此路線,請考慮您可能需要正確終止字符串。

+0

當然,如果你使用單獨的緩衝區作爲目的地,那麼關於兩個指針的相同的東西也適用。 –

+0

另外,爲了使工作更容易,請在數據[]和要檢查的元音之間進行檢查,然後將其添加到字符串中(如果它們不是元音)。 –

0

嘗試使用std容器和對象

#include <iostream> 
#include <string> 
#include <vector> 

std::string editStr = "qweertadoi"; 
std::vector<char> vowels{'i', 'o', 'u', 'e', 'a'}; 

int main() { 

    for(unsigned int i = 0; i<editStr.size(); i++){ 
     for(char c: vowels){ 
      if(editStr.at(i) == c){ 
       editStr.erase(i--,1); 
       break; 
      } 
     } 
    } 

    std::cout << editStr << std::endl; 
    return 0; 
} 
相關問題