Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C中字母的倒装大写_C_Function - Fatal编程技术网

C中字母的倒装大写

C中字母的倒装大写,c,function,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);

好的,我被要求用一个函数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;

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


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

在main方法中不获取反转的基本原因是您只将lettermain的副本传递给inverse\u 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; 

}

您正在执行按值传递复制值,这并不反映在调用调用方函数时所做的更改。做

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 

是C中的关键字。该语句终止函数的执行,并将控制权返回给调用函数。return语句还可以向调用函数返回一个值,从函数invert_caps返回转换后的值

下面是一个使用库函数检测和更改字母大小写的小例程

#include <ctype.h>

int invert_case(int c)
{
    return islower(c) ? toupper(c) : isupper(c) ? tolower(c) : c;
}

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

您正在执行按值传递、按指针传递,或者只是从函数中返回转换后的值,读取“按值传递”和“按指针传递”以及“按引用传递”。^^或者返回字母。老实说,你真的应该考虑从C的初学者的书开始,你的程序是不可移植的。使用toupper、tolower、isupper和islower。65、90、32等不受C标准的保证。好的,所以我写了回信;在函数中,仍然没有work@ace您将返回的字母分配给lettermain变量?如果这对您有效,您可以接受答案吗?因为这对未来的用户有好处。请参阅以获取更多帮助。注意:我犯了一个错误,写的是X而不是Z,但我马上就能找到错误,因为我使用的是字符常量,而不是您无法记忆的ascii值。我说的是32。这和使用原始ascii码一样糟糕value@StoryTeller对不起,你没听懂吗?你是说char常量是Cletter=letter+32中的int类型;你没有测试这个代码,是吗?提示:它总是返回一个大写字母。我希望返回“\0”,而不是C,但C甚至是正确的,没有改变,但很好@GrijeshChauhan:这段代码将保留数字、标点符号和控制字符不变。为什么不使用isalpha?即使对于这个特定场景,isalpha相当于islowerc | | isupperc。isalpha在语义上应该更正确。@Kira:我使用if而不是嵌套的?:三元运算符添加了相同逻辑的一个版本。我只对小写字母叫toupper,对大写字母叫tolower。任何非字母字符都会原封不动地返回。这里并不真正需要isalpha。如果输入不是大写或小写,那么toupper和tolower将保持不变。换句话说,在这个函数中,您只需要一个if。
#include <ctype.h>

int invert_case(int c)
{
    return islower(c) ? toupper(c) : isupper(c) ? tolower(c) : c;
}
int invert_case(int c)
{
    if (islower(c)) {
        return toupper(c);
    }
    if (isupper(c)) {
        return tolower(c);
    }
    return c;
}