C:比较两个字符数组
这是我的腐烂功能
int my_rot13(int c) {
if ('a' <= tolower(c) && tolower(c) <= 'z')
return tolower(c)+13 <= 'z' ? c+13 : c-13;
return c;
}
int my_rot13cmp(char *a, char *b) {
int i;
for (i=1; i<strlen(a); i++) {
if (my_rot13(a[i]) > my_rot13(b[i])) {
return 1;
}
}
return -1;
}
这应该输出1因为 D将是解码字符中的Q. W将是解码字符中的J. 并且Q&gt; Ĵ
printf("%d \n", my_rot13cmp("\0D\n", "\0W\n"));
但是这一直给我-1
比较这两个字符的正确方法是什么?
答案 0 :(得分:3)
你的字符串中有一个嵌入的0字符:
my_rot13cmp("\0D\n", "\0W\n");
这将导致my_rot13cmp中的strlen(a)
返回0 - 因为nul字符表示字符串的结尾。
删除字符串中的\ 0,然后在i=0
答案 1 :(得分:0)
strlen查找\0
符号来确定字符串长度,你的字符串有这个特殊的符号,所以strlen不起作用,你有几个变种:
1 具有单独的长度参数,例如:
int my_rot13cmp(char *a, char *b, size_t aLength, size_t bLength)
{
if (aLength > bLength)
return 1;
if (aLength < bLength)
return -1;
for (int i=0; i<aLength; i++)
if (my_rot13(a[i]) > my_rot13(b[i]))
return 1;
else if (my_rot13(a[i]) < my_rot13(b[i]))
return -1;
return 0;
}
2 如果您知道所有字符串都是以\0
开头并且在结束之前不包含它(asciiz null终止符必须是),那么您可以使用此解决方案:< / p>
int my_rot13cmp(char *a, char *b)
{
a++; b++; // skips first \0 symbol
for (int i=0; i<strlen(a); i++) // note: what will be if A is longer than B?
if (my_rot13(a[i]) > my_rot13(b[i]))
return 1;
else if (my_rot13(a[i]) < my_rot13(b[i]))
return -1;
return 0;
}