2013-03-11 33 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);