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

标签 c char c-strings string-literals tolower

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

这是我的代码

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

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

我是新来的,如果这个问题在之前得到回答,我很抱歉,但我问这个问题是因为我找不到解决我的问题的具体解决方案。我已经尝试过该线程中的内容:Converting Char * to Uppercase in C 但它对我来说也不起作用。

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

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

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

这也解决了来自莫斯科的 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)!= '\0'){
        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] 有点不寻常,我至少会用 (' 替换魔术常量 32 a'-'A'),但被调用者的代码在其他方面都可以。)

关于无法在没有 toupper 的情况下使用 C 中的循环将 char* 指针转换为小写/大写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62122333/

相关文章:

c - 将数据存储到共享对象中怎么样?

c - 所有 `if/else-if/else-if` 语句的段错误,但在评论其中一个语句时没有

c - .Tpo文件是怎么生成的?为什么会有 "NO Such file or directory"?

java - 字符匹配 DNA 程序

c - 为什么在 C 中我的字符串后打印数字 '7'?

c++ - 文件流实际上是如何工作的?

c - 为什么 scanf 会跳过获取字符串输入?

c++ - getline 超过指定数量

c++ - 调试断言失败,表达式:(unsigned)(c +1)<= 256提问c++

c++ - 为什么这个构造函数要这样写?