2013-03-11 35 views
0

我的程序的目標是切換輸入的兩個字母的個案。例如,轉向A和B轉向b。當我知道我的邏輯是正確的時,我無法讓我的代碼工作。切換char個案,指針問題

#include <stdio.h>; 

void switcharoo(char *ch1,char *ch2) 
{ 

    if(*ch1 >= 'a' && *ch1 <= 'z' && *ch2 >= 'A' && *ch2 <= 'Z') 
    { 
     *ch1 = 'A' + *ch1 - 'a'; 
     *ch2 = 'a' + *ch2 - 'A'; 
    } 
    else if(*ch1 >= 'A' && *ch1 <= 'Z' && *ch2 >= 'A' && *ch2 <= 'Z') 
    { 
     *ch1 = 'a' + *ch1 - 'A'; 
     *ch2 = 'a' + *ch2 - 'A'; 
    } 
    else if(*ch1 >= 'a' && *ch1 <= 'z' && *ch2 >= 'a' && *ch2 <= 'z') 
    { 
     *ch1 = 'A' + *ch1 - 'a'; 
     *ch2 = 'A' + *ch2 - 'a'; 
    } 
    else if(*ch1 >= 'A' && *ch1 <= 'Z' && *ch2 >= 'a' && *ch2 <= 'z') 
    { 
     *ch1 = 'a' + *ch1 - 'A'; 
     *ch2 = 'A' + *ch2 - 'a'; 
    } 
} 

int main() 
{ 
    char lettera,letterb; 

    printf("Please input a first character: "); 
    scanf("%c", &lettera); 
    printf("Please input a first character: "); 
    scanf("%c", &letterb); 

    switcharoo(lettera,letterb); 
    printf("%c\n %c\n",lettera,letterb); 

    return 0; 
} 
+3

等待,爲什麼'switcharoo'需要同時處理兩個字符?簡化。 – 2013-03-11 04:28:08

+0

,因爲我的任務是這麼說的; [ – dLiGHT 2013-03-11 04:31:51

+0

@JonathonReinhart,任何沒有道理的問題,總是原來是一項任務:) – 2013-03-11 04:36:08

回答

4
scanf("%c", &lettera); 
scanf("%c", &letterb); 

這可能不是你想做的。在輸入第一個字母(假設您的提示意味着您期待它們在不同的行上)後,換行符(輸入)字符將作爲第二個字母讀入。你必須輸入兩個字母,然後換一個換行符才能成功讀入letteraletterb ......只能提示一次輸入2個字符。此外,最好檢查scanf的返回值,以確保它獲得了您所要求的輸入...。

+0

OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOHhhhhhhhhh,該死的。謝謝! – dLiGHT 2013-03-11 04:34:23

+1

@dLiGHT,至少讓你的評論看起來美觀,如果不是你的程序:) – 2013-03-11 04:43:25

0

你應該叫

switcharoo(lettera,letterb); 

switcharoo(&lettera,&letterb); //passing address of lettera and letterb 

因爲你是在功能服用char *

+0

我試過了,然後我的代碼繼續從不調用函數,並繼續輸入兩次相同的字母。 – dLiGHT 2013-03-11 04:30:16

+0

這將是'scanf'的問題,嘗試使用'getc'來讀取字符。 – Rohan 2013-03-11 04:35:00

3

除非我需要創建我自己的功能,否則我會使用#include <ctype.h>函數使我的生活更輕鬆。

#include <ctype.h> 
#include <stdio.h> 

int main() 
{ 
    char lettera,letterb; 

    printf("Please input a first character: "); 
    scanf("%c", &lettera); 
    printf("Please input a first character: "); 
    scanf(" %c", &letterb); // note the space in front of %c to flush '\n' 

    // lettera conversion 
    if(isupper(lettera)) { 
     lettera = tolower(lettera); 
    } else if (islower(lettera)) { 
     lettera = toupper(lettera); 
    } 

    // letterb conversion 
    if(isupper(letterb)) { 
     letterb = tolower(letterb); 
    } else if (islower(letterb)) { 
     letterb = toupper(letterb); 
    } 

    printf("%c\n %c\n",lettera,letterb); 

    return 0; 
} 
0

您的代碼將無法運行。編譯器會給出錯誤,因爲不能將char轉換爲char *。

嘗試按照Rohan的建議調用你的函數。

或者你可以簡化你的功能。僅將它用於一個參數並將其調用兩次。

char changeCase(char ch) { 
    if (ch >= 'A' && ch <= 'Z') 
    ch -= 32; 
    if (ch >= 'a' && ch <= 'z') 
    ch += 32; 
    return ch; 
} 

在主,你可以寫,

char lettera, letterb; 
//get values of lettera and letterb 
lettera = changeCase(lettera); 
letterb = changeCase(letterb);