2013-07-20 177 views
-3

好吧,所以我被要求使用inver_caps函數在C中反轉大寫。我的功能正常工作並正確打印新的字母,但是我爲什麼在主打印時無法正確打印?反轉C中的字母大小寫

任何想法?

void invert_caps (char letter); 
int main(void){ 

    char lettermain; 

    printf("Enter a letter: "); 
    scanf(" %c", &lettermain); 

    invert_caps(lettermain); 

    printf("The invert of the letter is %c \n", lettermain); 

system("PAUSE");  
return 0; 
} 

void invert_caps (char letter){ 

    printf("\nletter is %d\n",letter); /*this was used for debugging*/ 

    if ((int)letter >=65 && (int)letter<=90){ 

     letter = (int)letter+32; 
    }else{ 

     letter = (int)letter - 32; 
    } 

    printf("\nnew letter is %d or %c\n",letter, letter); /*this was used for debugging*/ 
return letter; 

} 
+0

您正在通過值傳遞,通過指針傳遞,或者直接從函數 –

+0

返回轉換後的值,在'按值傳遞'和'按指針傳遞'以及'通過引用傳遞'中進行了讀取。 – user93353

+2

^^或者返回'letter'。老實說 - 你真的應該考慮從C的初學者的書開始, –

回答

1

你是不是在main方法獲得反轉的根本原因是你只允許通過lettermain副本invert_caps()方法。 而不是做到以下幾點,

void invert_caps (char letter); 
int main(void){ 

    char lettermain; 

    printf("\n=========Question 8=========\n"); 
    printf("Enter a letter: "); 
    scanf(" %c", &lettermain); 

    lettermain=invert_caps(lettermain); 

    printf("The invert of the letter is %c \n", lettermain); 

system("PAUSE");  
return 0; 
} 

char invert_caps (char letter){ 

    printf("\nletter is %d\n",letter); 

    if ((int)letter >=65 && (int)letter<=90){ 

     letter = (int)letter+32; 
    }else{ 

     letter = (int)letter - 32; 
    } 

    printf("\nnew letter is %d or %c\n",letter, letter); /*this was used for debugging*/ 
return letter; 

} 
+0

字謝謝..... – ace

+0

如果這對你有用,你能接受答案嗎?因爲它對未來的SO用戶有好處。請參閱http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work以獲取更多幫助。 – Dulanga

0

因爲當你從main傳遞lettermain變量,它是複製

您需要返回新的字符,或通過引用傳遞變量。

+0

好吧,我沒有回信;在函數中,仍然不起作用 – ace

+0

@ace然後將返回的字母分配給'lettermain'變量? –

3

你正在做的值(複印件值)通,一點不反映在調用調用函數做出改變。 (1)通過指針傳遞(傳遞地址),或者
(2)僅從函數返回轉換後的值。注意:不要在代碼中使用ascii值,只需使用char常量來保持代碼可讀(您不必記住ascii值)。 例如,我爲你寫(2)解決方案(我相信你現在很容易,避免在這個階段的指針)。

理解代碼閱讀評論:

char invert_caps (char letter){ 
//^added return type, its not void now 
    if (letter >= 'A' && letter<= 'Z'){ // not using ASCII value but char Constants 
     letter = letter + ('a' - 'A');    // its more readable 
         // Note 32 = 'a' - 'A' that is 97 - 54 
    } 
    else { 
     if (letter >= 'a' && letter<= 'z'){// Add this case, to be safe is good practice 
      letter = letter - ('a' - 'A'); 
     } 
     else 
      letter = '\0'; // if letter is neither Upper or lower alphabetic case 
    }     // then convened it into nul symbol (exception case) 
    return letter; // added a line 
} 
// I removed unnecessary typecasts and debug statements 

在main(),你需要在同一個地方調用它像:

lettermain = invert_caps(lettermain); 
//^return value assigned to variable `lettermain` 

return是C中的return語句關鍵詞終止函數的執行並將控制返回給調用函數。 return語句也可以返回一個值給調用函數,並從函數invert_caps()返回轉換後的值。

+0

仍然使用一個神奇的數字...... – StoryTeller

+0

注意:我寫了'X'而不是'Z'的錯誤,但是我立刻發現了錯誤,因爲我使用的是char常量**而不是** ascii值,您不能記住。 –

+0

我在說'32'。這和使用原始ASCII值一樣糟糕 – StoryTeller

2

這是一個小例程,它使用庫函數來檢測和更改字母大小寫。

#include <ctype.h> 

int invert_case(int c) 
{ 
    return islower(c) ? toupper(c) : isupper(c) ? tolower(c) : c; 
} 

如果你不喜歡嵌套?:三元運營商,這裏是使用if相同的邏輯。

int invert_case(int c) 
{ 
    if (islower(c)) { 
     return toupper(c); 
    } 
    if (isupper(c)) { 
     return tolower(c); 
    } 
    return c; 
} 

注:這是可以變得更加簡單,看戴夫下面的評論。

+0

而不是'C'我會喜歡返回''\ 0'',但'C'甚至是正確的(不變),但它很好! –

+0

@GrijeshChauhan:該代碼將保持數字,標點符號和控制字符不變。 – Blastfurnace

+0

你爲什麼不使用'isalpha()'?即使'isalpha()'等同於'(islower(c)|| isupper(c))',只是針對這個特定場景。 'isalpha()'在語義上更加正確。 – yeyo

相關問題