2012-07-10 169 views
1

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

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 

两个字符必须保持const ,否则我认为这将工作... 所以我的问题:有没有办法忽略大写,同时保持char -strings const

+2

那么你为什么不只是使用一个临时要存储的值(tolower(* x))? – Marcus 2012-07-10 02:09:59

+0

将数据复制到非常量字符数组中,将所有字符转换为小写字母。 – 2012-07-10 02:10:00

+0

@Marcus我不允许将* x1或* x2更改为除const char – user1513475 2012-07-10 02:13:21

回答

2

你可以使用一个临时char变量:

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

if (c1 == c2) 
... 
+0

虽然这是同样的问题,因为您不能将任何内容分配给只读位置(* x1和* x2)。 – user1513475 2012-07-10 02:18:39

+0

它们被分配给局部变量。这是只读吗? – Mysticial 2012-07-10 02:19:18

+0

@ user1513475:该代码分配给本地非const char'变量'c1'和'c2'。没有违反常量在那里。 – 2012-07-10 02:19:31

2

当然 - 你可以的tolower比较结果就在if声明:

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

当字符不同时,你通常不会返回0 – 2012-07-10 02:17:54

+1

@JonathanLeffler你是对的,我忘了。 – dasblinkenlight 2012-07-10 02:22:16

+0

轻微:可以简化为'* x1 && tolower(* x1)== tolower(* x2)'。 – chux 2015-04-25 20:00:17

相关问题