2017-08-07 55 views
-3

使用C++語言,函數LetterChanges(str)採用str參數傳遞並使用以下算法對其進行修改。字符串代碼不工作

將字符串中的每個字母替換爲 字母表中的後面的字母(即c變成d,z變成a)。然後在這個新的字符串(a,e,i,o,u)中大寫每個元音 ,並最終返回這個修改後的 字符串。

#include <iostream> 
using namespace std; 

string LetterChanges(string str) { 

    // code goes here 
    string str2 = "abcdefghijklmnopqrstuvwxyz"; 
    int j; 
    for (int i = 0; str[i] != '\0'; i++) { 

     for (j = 0; str2[j] != '\0'; j++) { 

      if (str[i] == str2[j]) { 

       str[i] = str2[j + 1]; 

      } 
     } 
    } 
    for (int i = 0; str[i] != '\0'; i++) { 
     if (str[i] == 'a') { 
      str[i] = 'A'; 
     } 
     else if (str[i] == 'e') { 
      str[i] = 'E'; 
     } 
     else if (str[i] == 'i') { 
      str[i] = 'I'; 
     } 
     else if (str[i] == 'o') { 
      str[i] = 'O'; 
     } 
     else if (str[i] == 'u') { 
      str[i] = 'U'; 
     } 
    } 
    return str; 
} 
int main() { 
    // keep this function call here 
    cout << LetterChanges(gets(stdin)); 
    return 0; 
} 

我試圖運行此代碼,但它是不是給的願望輸出請幫助..

+7

這聽起來像你可能需要學習如何使用調試器來逐步通過你的代碼。使用一個好的調試器,您可以逐行執行您的程序,並查看它與您期望的偏離的位置。如果你打算做任何編程,這是一個重要的工具。進一步閱讀:[如何調試小程序](http://ericlippert.com/2014/03/05/how-to-debug-small-programs/) – NathanOliver

+0

在前兩個For循環我試圖複製字母和在下一個循環嘗試大寫小寫元音。 –

+0

函數'string LetterChanges(string str)'沒有機會修改傳遞給它的字符串(只是它的一個副本)。也許把它改爲'string LetterChanges(string&str)'? – user463035818

回答

2

的功能

讓我們先從你的第一個循環:

for (int i = 0; str[i] != '\0'; i++) { 
    for (j = 0; str2[j] != '\0'; j++) { 
     if (str[i] == str2[j]) { 
      str[i] = str2[j + 1]; 
     } 
    } 
} 

這裏有幾件事。首先,我們甚至不需要處理str2。用C++人物使用ASCII編碼,這意味着我們實際上可以這樣做str[i]++改變一個「A」到「B」或「E」到「F」,等...

另外,我想建議不要使用str[i] != '\0'。我們使用標準庫字符串而不是C字符串是有原因的,所以我們不妨使我們的生活更輕鬆並使用str.size()。沿着這些相同的路線,我會建議str.at(i)而不是str[i],因爲前者會爲我們做邊界檢查。

最後,如果您包含cctype,那麼我們可以使用isalpha函數來確保我們只修改字母字符(無數字或空格等)。

因此,你的第一環就呈現:

for (int i = 0; i < str.size(); i++) { 
    if(isalpha(str.at(i)){ 
     if(str.at(i) == 'z') str.at(i) = 'a'; //special case 
     else str.at(i)++; 
    } 
} 

至於你的第二個循環,你甚至都不需要它!我們實際上可以將所有內容直接納入第一個。只要我們確保在之後做元音修改,我們已經更改了單個字母。

也可以用一些ASCII數學轉換從小寫到大寫。小寫字母和大寫字母之間的區別是'A'-'a',所以如果我們將其添加到任何小寫字母,它會給我們它的大寫版本!

有了這一切,我們可以修改代碼以:

for (int i = 0; i < str.size(); i++) { 
    if(isalpha(str.at(i)){ //Make sure it's a letter! 
     if(str.at(i) == 'z') str.at(i) = 'a'; //special case 
     else str.at(i)++; 

     if(str.at(i) == 'a' | str.at(i) == 'e' | str.at(i) == 'i' 
      | str.at(i) == 'o' | str.at(i) == 'u') { 
      str.at(i) += 'A' - 'a'; 
    } 
} 

你的主要

這裏只有一件事要在這裏解決。請勿使用gets進行輸入。如果您要查找單個單詞,請使用提取操作符>>,或者如果您想要整行,請使用getline。

string word, line; 

getline(cin, line); 
cin >> word; 

cout << LetterChanges(line) << endl; 
cout << LetterChanges(word) << endl; 
+0

Thankyou非常瞭解代碼和更多的東西也謝謝你,你是一個天才 –

+0

可以請你解釋這一行str.at(i)+ ='A' - 'a 「; –

+0

@kunalsuryawanshi查看[ASCII表格](http://www.asciitable.com/)。任何小寫字母/大寫字母對之間的區別是相同的。也就是說,從'b'到'B'的距離與'f'到'F'是一樣的......所以如果我們加上那個差別(我選擇用a來計算它),即「對任何小寫字母的' - 'a',它將變成一個大寫字母。如果你不相信我,請親自嘗試與桌子上的數學! – scohe001