0

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 > J

printf("%d \n", my_rot13cmp("\0D\n", "\0W\n"));

但这一直给我-1

比较这两个字符的正确方法是什么?

4

2 回答 2

3

您的字符串中有一个嵌入的 0 字符:

 my_rot13cmp("\0D\n", "\0W\n");

这将导致strlen(a)my_rot13cmp 内部返回 0 - 因为 nul 字符表示字符串的结尾。

删除字符串中的那些 \0,然后开始循环i=0

于 2013-10-30T22:16:50.627 回答
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 终止符必须是),你可以使用这个解决方案:

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;
}
于 2013-10-30T22:27:00.857 回答