我一直在寻找答案。我将制作一系列自己的字符串函数,例如my_strcmp()my_strcat()等。
strcmp()是否可以处理两个字符数组的每个索引,并且如果在两个字符串的相同索引处的ASCII值较小,则该字符串按字母顺序较大,因此返回0或1或2?我想我要问的是,它是否使用字符的ASCII值返回这些结果?

任何帮助将不胜感激。

[修订]

好,所以我想出了这个方法...它适用于所有情况,除非第二个字符串大于第一个字符串。

有小费吗?

int my_strcmp(char s1[], char s2[])
{
    int i = 0;
    while ( s1[i] != '\0' )
    {
        if( s2[i] == '\0' ) { return 1; }
        else if( s1[i] < s2[i] ) { return -1; }
        else if( s1[i] > s2[i] ) { return 1; }
        i++;
    }
    return 0;
}


int main (int argc, char *argv[])
{
    int result = my_strcmp(argv[1], argv[2]);

    printf("Value: %d \n", result);

    return 0;

}

最佳答案

strcmp的伪代码“实现”如下所示:

define strcmp (s1, s2):
    p1 = address of first character of str1
    p2 = address of first character of str2

    while contents of p1 not equal to null:
        if contents of p2 equal to null:
            return 1

        if contents of p2 greater than contents of p1:
            return -1

        if contents of p1 greater than contents of p2:
            return 1

        advance p1
        advance p2

    if contents of p2 not equal to null:
        return -1

    return 0

基本上就是这样。依次比较每个字符,然后根据该字符确定第一个或第二个字符串是否更大。

仅当字符相同时,您才移至下一个字符;如果所有字符都相同,则返回零。

请注意,您不一定会得到1和-1,规范指出任何正值或负值都足够,因此您应始终使用< 0> 0== 0检查返回值。

将其转换为实数C将相对简单:
int myStrCmp (const char *s1, const char *s2) {
    const unsigned char *p1 = (const unsigned char *)s1;
    const unsigned char *p2 = (const unsigned char *)s2;

    while (*p1 != '\0') {
        if (*p2 == '\0') return  1;
        if (*p2 > *p1)   return -1;
        if (*p1 > *p2)   return  1;

        p1++;
        p2++;
    }

    if (*p2 != '\0') return -1;

    return 0;
}

还请记住,字符上下文中的“更大”不一定针对所有字符串函数都基于简单的ASCII排序。

C有一个称为“语言环境”的概念,它指定(除其他事项外)排序规则或基础字符集的顺序,例如,您可能会发现字符aáàä都被视为相同。像strcoll这样的函数会发生这种情况。

关于c - strcmp()如何工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12136329/

10-12 16:05