无法在没有 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;
}
我正在尝试创建一个函数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;
}