C中的字符串比较

时间:2015-11-17 23:11:33

标签: c strcmp alphabetical

我对C中的字符串比较grass函数感到有些困惑。

如果您有两个字符串,grapesstrcmp(grass, grapes);并且您使用guard会产生39或任何正数,这是否意味着" grape"在" grass"之前按字母顺序排列,或者相反?

我知道如果结果是0,他们就会相等。

2 个答案:

答案 0 :(得分:0)

strcmp的返回值在C99 7.21.4中定义

  

比较函数memcmp,strcmp返回的非零值的符号,   和strncmp由第一个值的差异符号决定   在对象中不同的字符对(都被解释为unsigned char)   相比较。   因此,如果结果为正,则意味着第二个参数位于第一个参数之后。

这不完全是字母顺序,而是依赖于characers的底层编码。例如,在ASCII中,'B' < 'a',因为'B'编码为66而'a'是97.如果字符都是相同大小写的字母,则这将等同于所有字母顺序(非多字节编码我很熟悉,但我不相信这是必需的。

对于像“草”和“葡萄”这样的情况,它只会继续扫描,直到找到不同的字符(在这种情况下为“s”与“p”),然后做出决定。一个特殊情况是当一个字符串是另一个字符串的子字符串时:例如“葡萄”与“葡萄”。对于这种情况,你只需要记住“葡萄”实际上是{ 'g', 'r', 'a', 'p', 'e', '\0' },并应用正常规则:'\0' < 's',所以“葡萄”出现在“葡萄”之前。

这将是strcmp的一致性实现:

int strcmp(const char *a, const char *b) {
    size_t i = 0;
    while (a[i] || b[i]) {
        if (a[i] != b[i]) {
            if (a[i] < b[i]) return -1;
            else return 1;
        }
        i++;
    }
    return 0;
}

答案 1 :(得分:0)

strcmp函数开始比较每个字符串的第一个字符。如果它们彼此相等,则继续使用以下对,直到字符不同或者到达终止空字符为止。

这意味着,此函数执行字符的二进制比较。

以下程序应该让您了解strcmp的工作原理:

#include <stdio.h>
#include <string.h>

int stringcmp(char *s1, char *s2){
    int count = 0;

    while (s1[count] == s2[count]) {
        if (s1[count] == '\0' || s2[count] == '\0')
            break;
            count++;
    }

    if (s1[count] == '\0' && s2[count] == '\0'){
        return 0;
    }

    if(strlen(s1) < strlen(s2)){
        return -1;
    }else{
        return 1;
    }
}

int main(void){
    char *b = "grass";
    char *a = "grapes";

    if(stringcmp(a, b) == 0){
        printf("Are equal.\n");
        printf("Length of A = %zu\n",strlen(a));
        printf("Length of B = %zu\n",strlen(b));
        printf("Return of stringcmp = %d\n",stringcmp(a, b));
    }else{
        printf("Are not equal.\n");
        printf("Length of A = %zu\n",strlen(a));
        printf("Length of B = %zu\n",strlen(b));
        printf("Return of stringcmp = %d\n",stringcmp(a, b));
    }

   return 0;
}

输出:

Are not equal.
Length of A = 5
Length of B = 6
Return of stringcmp = -1

如果您与b交换,则获得:

Are not equal.
Length of A = 6
Length of B = 5
Return of stringcmp = 1

如果A和B相同:

Are equal.
Length of A = 5
Length of B = 5
Return of stringcmp = 0