反转C中的大写字母

时间:2013-07-20 17:21:58

标签: c function

好的,所以我被要求使用函数inver_caps反转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;

}

4 个答案:

答案 0 :(得分: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()返回转换后的值。

答案 1 :(得分: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;
}

注意:这可以更简单,请参阅下面的 Dave的评论。

答案 2 :(得分:1)

在主方法中没有得到反转的基本原因是您只是将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; 

}

答案 3 :(得分:0)

因为当您从lettermain传递main变量时,它是复制的

您需要返回新字符,或者通过引用传递变量。