C语言中使用函数将大写字符串转换为小写字符串时出现问题

3

我正在尝试编写一个程序,它只会比较相同大小写的字母,但是首先它应该将任何大小写转换为特定的大小写。

但是我在使用函数将字符串转换为任何特定大小写时遇到了问题,尽管我已经弄清楚如何在没有函数的情况下完成这个任务。这是我的代码。有谁能帮我找出我哪里错了吗?

#include<stdio.h>
#include<string.h>
void order(char input[])
{
    int i=0;

    while(input[i]!='\0')
    {
        if(input[i]>'65' && input[i]<'92')
        {
            input[i]+=32;
           // printf("WORKING\n");
        }

        i++;

    }
}
int main()
{
    char input1[101], output1[101];
    char input2[101], output2[101];
    int r;

    scanf("%s",tolower(input1));
    scanf("%s",input2);

    order(input1);
    order(input2);

    printf("%s\n",input1);
    printf("%s\n",input2);

    /*

    r=strcmp(output1,output2);


    if(r<0)
        printf("-1\n");
    else if(r>0)
        printf("1\n");
    else
        printf("0\n");

    */

}
3个回答

4

将此更改为:

if(input[i]>'65' && input[i]<'92')

转换为:

if(input[i] >= 65 && input[i] <= 90)

既然您想检查A和Z的ASCII代码。请注意,因为您使用了神奇数字,所以两者都有错误。我不得不查看ASCII表格才能弄清楚您还需要等号,并且90(代表Z的代码),而不是92(代表'\'的代码)。

我建议您使用字符常量,就像这样:

if(input[i] >= 'A' && input[i] <= 'Z')

输出显示与插入的字符串相同。 - mahin hossen
我希望它能将字符串转换为任何特定的大小写,无论是大写还是小写。 - mahin hossen
1
我想要这个函数可以转换任何情况下的文本,就像给出的例子,我想把它转换成小写字母。虽然我的语法有误,但是我已经得到了答案,谢谢。 - mahin hossen
1
不仅使用字符常量更清晰易懂,而且现在也更具可移植性。每个人都是赢家! - Toby Speight
3
“更加便携”牵涉到更深层次的问题。1)除了普遍存在的ASCII之外,使用EBCDIC编码时,将'A'用于[A-Z]是不连续的,因此 if() 是错误的代码。2)源代码和编码文件字符的字符编码可能不同。但对于学习者来说,使用'A'65相比较更好理解。 - chux - Reinstate Monica
显示剩余3条评论

4

常量和 off-by-1 错误。

  • '65' is a multi byte constant and certainly 65 was meant. @gsamaras. ASCII Z is 90.

    // if(input[i]>'65' && input[i]<'92')
    if(input[i]>65 && input[i]< Zee)
    
  • Off by 1 due to > vs. >=

    // if(input[i]>'65' && input[i]<'92')
    // if(input[i]>65 && input[i]< Zee)
    if(input[i] >= 65 && input[i] <= 90)
    
字符常量更易于自我说明。考虑 'A'
    if(input[i] >= 'A' && input[i] <= 'Z')

理想情况下,代码应该使用标准的C库函数来检测大小写。
    if(isupper((unsigned char) input[i]))

然而,代码可以直接调用toupper()并跳过if()的判断。

while(input[i]) {
  input[i] = tolower((unsigned char) input[i]);
  i++;
}

// or 

for (size_t i = 0; input[i]; i++) {
  input[i] = tolower((unsigned char) input[i]);
}

1

1
抱歉,我试图让它接受小写字符串,但没有成功。在发布这里时忘记更改它了。 - mahin hossen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接