C 不区分大小写的常量字符串比较

C 不区分大小写的常量字符串比较,c,string,case-insensitive,C,String,Case Insensitive,我试图用这个函数比较两个字符串,不区分大小写 int strcasecmp(const char *x1, const char *x2); 我的副本是正确的,但是区分大小写的部分给我带来了一些麻烦,因为const是一个常数,因此是只读的,这使得这些失败: *x1 = (tolower(*x1)); // toupper would suffice as well, I just chose tolower *x2 = (tolower(*x2)); // likewise here 两个字

我试图用这个函数比较两个字符串,不区分大小写

int strcasecmp(const char *x1, const char *x2);
我的副本是正确的,但是区分大小写的部分给我带来了一些麻烦,因为const是一个常数,因此是只读的,这使得这些失败:

*x1 = (tolower(*x1)); // toupper would suffice as well, I just chose tolower
*x2 = (tolower(*x2)); // likewise here
两个字符必须保持
常量
,否则我认为这会起作用。。。
所以我的问题是:有没有一种方法可以在保留
char
-字符串
const
的同时忽略大小写?

您可以使用临时char变量:

char c1 = tolower(*x1);
char c2 = tolower(*x2);

if (c1 == c2)
 ...

您可以使用临时字符变量:

char c1 = tolower(*x1);
char c2 = tolower(*x2);

if (c1 == c2)
 ...

当然-您可以在
if
语句中比较
tolower
的结果:

while (*x1 && *x2 && tolower(*x1) == tolower(*x2)) {
    x1++;
    x2++;
}
return tolower(*x1)-tolower(*x2);

当然-您可以在
if
语句中比较
tolower
的结果:

while (*x1 && *x2 && tolower(*x1) == tolower(*x2)) {
    x1++;
    x2++;
}
return tolower(*x1)-tolower(*x2);


那么为什么不使用一个临时值来存储(tolower(*x))?将数据复制到一个非常量字符数组中,将所有字符转换为小写。@Marcus我不允许将*x1或*x2更改为常量字符以外的任何内容。不,你不必更改*x1或*x2,只需使用tmp1和tmp2即可。哦,好的,对不起。我现在明白了。谢谢你的帮助-非常感谢!那么为什么不使用一个临时值来存储(tolower(*x))?将数据复制到一个非常量字符数组中,将所有字符转换为小写。@Marcus我不允许将*x1或*x2更改为常量字符以外的任何内容。不,你不必更改*x1或*x2,只需使用tmp1和tmp2即可。哦,好的,对不起。我现在明白了。谢谢你的帮助-非常感谢!当字符不同时,您通常不会返回0 Minor:可以简化为
*x1&&tolower(*x1)=tolower(*x2)
。当字符不同时,您通常不会返回0 Minor:可以简化为
*x1&&tolower(*x1)=tolower(*x2)
。但问题相同,由于无法将任何内容分配给只读位置(*x1&*x2)。它们被分配给局部变量。这是只读的吗?@user1513475:该代码正在分配给本地非常量
char
变量
c1
c2
。分配给局部变量的一个优点是,您可以简单地返回差异,而无需重新计算小写值。唯一值得注意的是有符号的沉默;对于局部变量,最好使用
int
而不是
char
,以避免这些问题。您可能还会收到关于将有符号字符传递给宏的警告(可能是关于使用有符号字符为数组编制索引的警告)。是的,您说得对。我以前也看到过同样的编译错误。不过,这是同样的问题,因为您无法将任何内容分配给只读位置(*x1&*x2)。它们被分配给局部变量。这是只读的吗?@user1513475:该代码正在分配给本地非常量
char
变量
c1
c2
。分配给局部变量的一个优点是,您可以简单地返回差异,而无需重新计算小写值。唯一值得注意的是有符号的沉默;对于局部变量,最好使用
int
而不是
char
,以避免这些问题。您可能还会收到关于将有符号字符传递给宏的警告(可能是关于使用有符号字符为数组编制索引的警告)。是的,您说得对。我以前也看到过同样的编译错误。