我正在尝试创建一个函数 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/