检测大写字母时出错

时间:2015-05-14 15:26:33

标签: c

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

  1. 编写一个名为 toLowercase 的函数,它将一个字符作为参数,并将大写字母返回为小写。如果字符不是大写字母,则该函数应该保持不变。
  2. 编写一个程序,从用户那里获取任意多个字符(直到他/她输入"!")然后以小写形式输出第一个和最后一个输入的大写字母。

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

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

  3. 示例输入和所需输出

    lskdjfSFFKAFfkafafkKFAFkaKfgRORELKkjfks! ====> sk Mdsfisjf98948*3jkfHf9059,353953,^+%^+%! ====> 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;
    }
    

    我用三个不同的编译器尝试了这个代码,它输出了错误的结果。有一些奇怪的事情。它导致第一个字母错误但第二个字母正确。如果输入只包含一个大写字母,则输出再次正确。最后,我一遍又一遍地检查了这段代码。

    此代码有什么问题?

3 个答案:

答案 0 :(得分:1)

只有在第一次设置时才设置chFirst ==&#39; &#39;并在第一个if中执行。这样你就可以摆脱变量...

答案 1 :(得分:1)

有问题的逻辑在这里:

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;进行最终检查。

答案 2 :(得分:0)

正如@ace所指出的那样,你的逻辑存在一些问题。解决方案是提供此代码:

ir[, c("Species", "Species2") := lapply(.SD, as.character), .SDcols = facs]
sapply(ir, class)

在上一个 if(i==1) chFirst=chmod; 语句中,如下所示:

if

Correct output