gpt4 book ai didi

c - 让 char 的 int 值递增的另一种方法是什么?

转载 作者:行者123 更新时间:2023-12-04 08:50:58 25 4
gpt4 key购买 nike

在制作字符串函数的过程中,我尝试在某处构建一个类似于 strlwr() 的函数。我命名为 lowercase() :

#include <stdio.h>
#include <ctype.h>

char *lowercase(char *text);

int main() {
char *hello = "Hello, world!";
printf("%s\n", lowercase(hello));
}

char *lowercase(char *text) {
for (int i = 0; ; i++) {
if (isalpha(text[i])) {
(int) text[i] += ('a' - 'A');
continue;
} else if (text[i] == '\0') {
break;
}
}
return text;
}
我了解到大写字母和小写字母的差距是 32,这是我使用的。但是后来我收到了这个错误:
lowercase.c:14:13: error: assignment to cast is illegal, lvalue casts are not supported
(int) text[i] += 32;
^~~~~~~~~~~~~ ~~
如果它被认为是来自 A-Z 的字母,我想增加字符的值。结果我不能,因为字符在一个数组中,而且我这样做的方式对计算机来说似乎没有意义。
问: 我可以使用哪些替代方法来完成此功能?你能进一步解释为什么这个错误是这样的吗?

最佳答案

尽管在 C 字符串文字中有非常量字符数组的类型,但您不能更改字符串文字。

char *hello = "Hello, world!";
来自 C 标准(6.4.5 字符串文字)

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


所以你应该声明标识符 hello像一个字符数组
char hello[] = "Hello, world!";
在函数中你不应该使用像 32 这样的魔数(Magic Number)。 .例如,如果编译器使用 EBCDIC 编码,您的函数将产生错误的结果。
并在循环中而不是类型 int你必须使用类型 size_t因为 int 类型的对象可能无法存储 size_t 类型的所有值那是 sizeof 的返回类型运算符或函数 strlen .
这个说法
(int) text[i] += 32;
没有意义,因为在表达式的左侧,由于转换,存在一个右值。
该功能可以通过以下方式实现
char * lowercase( char *text ) 
{
for ( char *p = text; *p; ++p )
{
if ( isalpha( ( unsigned char )*p ) )
{
*p = tolower( ( unsigned char )*p );
}
}

return text;
}

关于c - 让 char 的 int 值递增的另一种方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64106398/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com