-3

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

4 回答 4

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()中我们返回转换后的值。

于 2013-07-20T17:31:56.340 回答
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 的评论。

于 2013-07-20T18:26:36.457 回答
1

您没有在 main 方法中获得反转的基本原因是您仅传递了lettermaintoinvert_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; 

}
于 2013-07-20T17:29:26.500 回答
0

因为当你从 传递lettermain变量时main,它被复制了

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

于 2013-07-20T17:25:20.823 回答