2010-11-22 100 views
4

我想製作一個程序,將輸入一個字符串並用*符號替換所有元音。所以,對於「hello world」,star_vowels應該返回「h * ll * w * rld」。如何用其他字符替換字符串中的特定字符

我對到目前爲止的代碼是:

int star_vowels(char s[]){ 

    int j; 

    j = 0; 
    while (s[j] != '0'){ 
     j++; 
     if (s[j] = 'a' || s[j] == 'e' || s[j] == 'i' || s[j] == 'o' || s[j] == 'u'){ 
      putchar('*'); 
     } else { 
      putchar(j); 
     } 
     return 0; 
    } 
} 
+3

那麼你的問題到底是什麼? – cdhowie 2010-11-22 08:13:31

+0

1。這是一個很好的方法去做它 – 2010-11-22 08:18:28

+0

2.如果是,那麼代碼有什麼問題,所以我不能運行它來執行它所需要的 – 2010-11-22 08:19:04

回答

6

這段代碼有許多事情錯。

1)while (s[j] != '0') 我相當肯定你想要檢查NUL字符,而不是字符常量零。更改'0''\0'

2)j++ 你遞增j您連看都不看你的數組的第0指數之前。如果你在s [0]處有一個元音,這將被錯過。將j++移動到while循環的最底部,就在結束大括號之前。

3)s[j] = 'a' 如果您應該使用等號運算符==代替,則在此處使用賦值運算符=。使用賦值運算符是合法的C代碼,因此將編譯。不幸的是,它會返回true,你會最終用星號替換你所有的字符

4)putchar(j); 當你真的想輸出s [j]時,你試圖輸出'j'(你的迭代器)你的角色)。

5)return 0 就像在#2中一樣,您的返回語句在錯誤的地方。你在while循環內有以外的。你寫它的方式,while循環只會在函數超出範圍之前執行第一次迭代。

int star_vowels(char s[]) { 

    int j = 0; 

    while (s[j] != '\0'){ 
     if (s[j] == 'a' || s[j] == 'e' || s[j] == 'i' || s[j] == 'o' || s[j] == 'u') { 
      putchar('*'); 
     } else { 
      putchar(s[j]); 
     } 
     j++; 
    } 
    return 0; 
} 
+0

如果它的大寫,你將不得不管理它。 – 2010-11-22 10:07:36

4

我認爲你的問題將是「一切都是*」那是因爲你的巨人if的這一部分:

if (s[j] = 'a'

這將永遠是真實的。你需要==

你還會把j++太早 - 你會跳過字符,因爲你進入循環後立即增加。

2

通過在開始處遞增j,您將失去0索引(第一個字符)。因爲您想要將新數據返回到外部世界(在函數範圍之外),您可以爲函數外的新數據分配內存,並將該數據的指針傳遞給此函數,或者您只需分配這個功能裏面的動態內存 - 記得要刪除它。

一個實現是:

char *star_vowels(char s[]){ 
    // let's allocate memory for the new string. 
    // its size should be strlen(s) + 1 (the ending char). 
    char *final = malloc(strlen(s) + 1); 

    int j = 0; 
    while (s[j] != 0){ 
     if (s[j] == 'a' || s[j] == 'e' || s[j] == 'i' || s[j] == 'o' || s[j] == 'u'){ 
      final[j] = '*'; 
     } else { 
      final[j] = s[j]; 
     } 
     j++; 
    } 
    final[j] = 0; // end the string 
    return final; 
} 

工作例如:http://codepad.org/dd2w5cuy

+0

這個問題要求替換人物 - 所有想到現場的理由,儘管你提到這個問題並說明了另一個選擇是很好的。 – 2010-11-22 08:39:53

相關問題