好的,所以我被要求使用函数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;
}
答案 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
变量时,它是复制的。
您需要返回新字符,或者通过引用传递变量。