无法在没有 toupper 的情况下使用 C 中的循环将 char* 指针转换为 Lower/uppercase

Can't convert to Lower/uppercase a char* pointer using a loop in C without toupper

我正在尝试创建一个函数toLowerCase(char *string),但我无法使其正常工作。

这是我的代码

void toLowerCase(char *string) {
    int i = 0;
    while (*(string+i) != '[=11=]') {
        if (*(string+i) >= 'A' && *(string+i) <= 'Z') {
            *(string+i) = *(string+i) + 32;
        }
        i++;
    }
    printf("%s", string);
}

我试图通过使用 *(string + i) 访问每个元素并使用 ASCII 转换为小写字母来遍历作为 char * 指针的字符串。

我是新来的,如果在这之前有人回答我很抱歉,但我之所以问是因为我找不到解决我问题的具体方法。我试过这个线程中的内容: 但它对我也不起作用。

编辑:这就是我调用函数的方式

int main() {
    toLowerCase("HELLO WORLD");
    return 0;
}

编辑 2:所以,我这样做了,正如 PSkocik 所展示的那样。它起作用了,但我不知道为什么会这样。 toLowerCase() 函数可以与任何 char * 指针一起使用吗?即使我没有将其声明为 char array?

这也解决了来自莫斯科的 Vlad 指出我使用的是字符串文字的问题

#define T 100
int main() {
    char string[T] = "HELLO WORLD";
    toLowerCase(&string);
    return 0;
}

编辑 3:非常感谢您的帮助!我没想到会这么快得到帮助!我不知道字符串文字是什么!

非常感谢您的宝贵时间

由于历史原因,C 字符串文字是 char[] 类型的,但它们实际上是 char const[] — 您不能修改它们。

幸运的是,C 允许您使用字符串文字初始化可写 char 数组,从而使创建可写副本变得非常容易:

#include <stdio.h>
void toLowerCase(char* string)
{
    int i=0;
    while(*(string+i)!= '[=10=]'){
        if (*(string+i) >= 'A' && *(string+i)<='Z'){
            *(string+i)= *(string+i)+32;
        }
        i++;
    }
}
int main()
{
     char string[]="HELLO WORLD";
     toLowerCase(&string[0]);
     puts(string);
    //prints: hello world
}

https://gcc.godbolt.org/z/X4YA5B

*(string+i) 而不是 string[i] 有点不寻常,我至少会用 ('a'-'A') 替换魔法常量 32,但被调用者的代码在其他方面是可以的。)

您正在将字符串文字传递给函数 toLowerCase,然后尝试使用 *(string+i)= *(string+i)+32; 更改它。

如果要更改 case 字符,则应将 Hello World 包含在变量中,然后将其传递给函数。

您不能更改字符串文字。任何更改字符串文字的尝试都会导致未定义的行为。

来自 C 标准(6.4.5 字符串文字)

7 It is unspecified whether these arrays are distinct provided their elements have the appropriate values. If the program attempts to modify such an array, the behavior is undefined.

所以不是这个调用

toLowerCase("HELLO WORLD");

至少使用

char s[] = "HELLO WORLD";

toLowerCase( s );

注意当函数return指向修改后的字符串,不输出字符串时会好很多。由函数的调用者决定是否输出修改后的字符串。

所以像这样定义函数

char * toLowerCase( char *string )
{
    // ...
    return string;
}

toLowerCase("HELLO WORLD"); => toLowerCase((char[]){"HELLO WORLD"}); 因为更改字符串文字是一个 UB。

你的函数应该return字符串作为参数。

char *toLowerCase(char* string)
{
    int i=0;
    while (string[i])
    {
        if (string[i] >= 'A' && string[i] <= 'Z')
        {
            string[i] += 'a' - 'A';
        }
        i++;
    }
    return string;
}



int main() 
{
    puts(toLowerCase((char[]){"HELLO WORLD"}));
    return 0; 
}