【问题标题】:Palindrome C program convert capital letters to small letters [duplicate]Palindrome C程序将大写字母转换为小写字母[重复]
【发布时间】:2023-07-15 10:34:01
【问题描述】:

在学校,我正在研究回文 C 程序。我快完成了,但我希望我的程序将“安娜”和“安娜”都标记为回文。我尝试了一些东西,但没有真正奏效。 我的代码:

#include <stdio.h>
#include <string.h>

int main() {
    char palindroom[50],a;
    int lengte, i;
    int woord = 0;

    printf("This program checks if your word is a palindrome.\n");
    printf("Enter your word:\t");
    scanf("%s", palindroom);

    lengte = strlen(palindroom);

    for (i = 0; i < lengte; i++) {
        if (palindroom[i] != palindroom[lengte - i - 1]) {
            woord = 1;
            break;
        }
    }

    if (woord) {
        printf("Unfortunately, %s is not palindrome\n\n", palindroom);
    }
    else {
            printf("%s is a palindrome!\n\n", palindroom);
    }
    getchar();
    return 0;
}

我见过一些人使用 ctype.h 中的 tolower,但我想避免这种情况。

所以我的问题是:如何将字符串中的所有大写转换为小写?

[ps。我可能编码的一些单词可能看起来很奇怪,但那是荷兰语。擦掉一个o就明白了]

谢谢。

【问题讨论】:

  • 如果你想做tolower()的用途,但不使用它,请给出理由。
  • "如何将字符串中的所有上限转换为下限?"您可以使用strlwr,但我认为它不是标准的 C 库函数。
  • 如果不想使用tolower() 的原因是“老师禁止”,那么老师希望您应用您在最近参加的课程中展示的内容。通过阅读教科书的最新章节,你能找到一些有用的东西吗?
  • “不使用 tolower”不足以作为解决方案的要求。您需要提供上下文。否则,必须通过猜测来对本地化、范围内情况、边缘情况、错误处理等进行假设。而且很可能会失败。此外,无论 StackOveflow 的老手们可能提出什么建议(即使有各种详细的要求),都可能通过“你是如何提出这个解决方案的,而我教你的内容没有涵盖这个解决方案?”给你带来麻烦。所以我认为这个问题太笼统了,可能还不清楚。
  • @Pablo 的重点可能是让学生有机会认识到您可以添加和减去字符。此外,有时:-) 标准库 可用。或者也许你必须实现它们 :) 如果你知道如何在没有标准库的情况下做事会派上用场

标签: c string palindrome letters


【解决方案1】:

如果您不想使用tolowertoupper,可以这样做:

// tolower
char c = 'U';
char lower_u = c | 0x20

// toupper
char c = 'u';
char upper_u = c & 0xdf

在 ASCII 中,低位和高位字符之间的区别是第 5 位。 第 5 位为 0 时为高位字符,第 5 位为 1 时为低位字符。

【讨论】:

  • 感谢您的回答和努力,但我更喜欢另一个。
【解决方案2】:

ASCII 表中大写和小写的区别是 32,因此如果输入中有大写字母,则可以添加 32 以将其转换为小写(http://www.asciitable.com/):

if ((currentletter > 64) && (currentletter < 91))
    {
        char newletter;
        newletter = currentletter + 32;
        str[i] = newletter;
    }
    else
    {
        str[i] = currentletter;
    }

修改程序:

#include <stdio.h>
#include <string.h>

int main() {
    char palindroom[50],a;
    int lengte, i;
    int woord = 0;

    printf("This program checks if your word is a palindrome.\n");
    printf("Enter your word:\t");
    scanf("%s", palindroom);

    lengte = strlen(palindroom);

    for (i = 0; i < lengte; i++) 
        {
             if (palindroom[i] > 64 && palindroom[i] < 91)
                    { 
                      palindroom[i] = palindroom[i] + 32;
                    }         

        if (palindroom[i] != palindroom[lengte - i - 1]) {
            woord = 1;
            break;
        }
    }

    if (woord) {
        printf("Unfortunately, %s is not palindrome\n\n", palindroom);
    }
    else {
            printf("%s is a palindrome!\n\n", palindroom);
    }
    getchar();
    return 0;
}

65是ASCII表中A的十进制表示,90Z的十进制表示,而a97(= 65 +32)和z是@ 987654331@(=90+32)

【讨论】:

  • 91 和其他神奇数字是什么?
  • 是的,这正是我想要的。非常感谢拉尔夫!我知道我必须对 ASCII 值做一些事情,就是这样。所以谢谢你。
  • 已编辑答案 ...
  • '64' 是 ASCII 中的 A,'91' 是 ASCII 中的 Z,32 是 ASCII 中小写字母和大写字母的区别。 ASCII 表表示计算机如何看待您使用的所有字符和内容的值
  • 大小写字母的区别是'a' - 'A'。通过添加'a' - 'A'而不是幻数32,不仅代码的意图更加清晰,从上到下将在ASCII EBCDIC中工作。