C 检测大写字母时出错

C 检测大写字母时出错,c,C,昨天我们参加了一门C语言课程的考试,问题是这样的: 编写一个名为toLowercase的函数,该函数将字符作为参数,并将大写字母返回到小写字母。如果字符不是大写字母,函数应返回它不变 编写一个程序,从用户处获取任意多个字符(直到用户输入“!”),然后以小写形式输出第一个和最后一个输入的大写字母 a。如果用户只输入一个大写字母,程序应以小写形式输出该大写字母两次 b。我们可以假设用户总是输入至少一个大写字母 示例输入和期望输出 lskdjfsffkaffkafkfafkfafkfgrorelkkj

昨天我们参加了一门C语言课程的考试,问题是这样的:

  • 编写一个名为toLowercase的函数,该函数将字符作为参数,并将大写字母返回到小写字母。如果字符不是大写字母,函数应返回它不变
  • 编写一个程序,从用户处获取任意多个字符(直到用户输入“!”),然后以小写形式输出第一个和最后一个输入的大写字母

    a。如果用户只输入一个大写字母,程序应以小写形式输出该大写字母两次

    b。我们可以假设用户总是输入至少一个大写字母

  • 示例输入和期望输出
    lskdjfsffkaffkafkfafkfafkfgrorelkkjfks==>
    sk
    Mdsfisjf98948*3jkfhf9059353953,^+%^+%==>
    mh

    sjfhsfR'^^“jfi2jpfj99ejfsdfs
    ==>
    rr


    这是我的密码:

    #include <stdlib.h>
    #include <stdio.h>
    
    char toLower(char n){
        char m=' ';
        if(n>='A'&&n<='Z'){
            m=n-'A'+'a';
            return m;
        }
        else
            return n;
    }
    
    int main(){
        int i=0;
        char ch,chmod,chFirst=' ',chLast=' ';
        scanf("%c",&ch);
        while(ch!='!'){
            chmod=toLower(ch);
            if(chmod!=ch){
                chLast=chmod;
                i++;
            }
            if(i==1)
                chFirst=chmod;
    
            scanf("%c",&ch);
        }
        if(i==1)
            chFirst=chLast;
    
        printf("%c%c",chFirst,chLast);
    
    
    
        return 0;
    }
    
    #包括
    #包括
    char-toLower(char-n){
    字符m='';
    
    if(n>='A'&&n仅当chFirst为stil==''时设置chFirst,并在第一个if中执行。通过这种方式,您可以摆脱变量i…

    ,正如@ace所指出的,您的逻辑中有一个小问题。解决方法是使用以下代码:

      if(i==1)
            chFirst=chmod;
    
    在前面的
    if
    语句中,如下所示:

    if(chmod!=ch){
            chLast=chmod;
            i++;
              if(i==1)
            chFirst=chmod;
        }
    

    有问题的逻辑如下:

    while(ch!='!'){
        chmod=toLower(ch);
        if(chmod!=ch){
            chLast=chmod;
            i++;
        }
        if(i==1)
            chFirst=chmod;
    
        scanf("%c",&ch);
    }
    
    如果第一个字母是大写,则考虑大小写。然后,
    chLast
    将被更改,
    i
    将递增,然后
    chFirst
    将被更改

    现在,如果第二个字母不是大写,
    i
    将不会递增,并且仍然是
    1
    。因此
    chFirst
    将再次更改,这不是您想要的

    更好的逻辑如下:

    while(ch!='!'){
        chmod=toLower(ch);
        if(chmod!=ch){
            chLast=chmod;
            if(i==0) {
                chFirst=chmod;
                i=1;
            }
        }
        scanf("%c",&ch);
    }
    

    在这个改进的逻辑中,有效地使用了
    i
    作为布尔变量,
    0
    表示
    chFirst
    未设置,
    1
    表示
    chFirst
    已设置。请注意,
    if(i==1)的最终检查chFirst=chLast;
    不是必需的。

    请将标题更改为有意义的“我的代码有什么问题?”不会帮助任何其他有相同问题的用户,因为它没有描述问题。毫无疑问,主题需要更改,但这个问题不值得否定和接近投票。它写得很好,OP已经尝试解决问题,给出了他的示例代码等+1来抵消否定投票。不,这不是casE测试第二种情况,你就会知道你的答案是错误的。@ace:谢谢你指出,我没有真正检查第二种情况我不明白
    scanf(“%c”,&ch)
    scanf(“%c”,&ch)之间的区别
    ?@Ahmetİnal:这是对代码的改进,但不能解决问题。谢谢,尽管检查
    chFirst==''
    (初始值)更符合逻辑