2015-11-17 560 views
-2

我有点困惑与字符串比较strcmp()功能C.字符串比较C

当你有两个字符串,grassgrapes和使用strcmp(grass, grapes);,导致39,或任何正数,不这意味着“葡萄”在“草”之前是按字母顺序排列的,还是相反?

我知道如果结果为0,它们是相等的。

+4

你的意思是'STRCMP( “草”, “葡萄”)'?如果*小于零*草在葡萄之前排序,如果*等于零*,则它们相等,如果*大于零*葡萄在草之前排序。 –

+0

看看[这个链接](http://www.tutorialspoint.com/c_standard_library/c_function_strcmp.htm)。在Return Value下 –

+0

如果你在linux上,你可以使用'man strcmp'。 – Jason

回答

0

的strcmp的返回值在C99被定义7.21.4

由比较功能memcmp,的strcmp返回非零值的符号,并 STRNCMP由之间的差的符号来确定第一个 字符对的值(两者都解释为无符号字符),它们在 的对比中有所不同。 所以如果结果是肯定的,这意味着第二个参数在第一个之后。

它不是完全按字母顺序排列,而是依赖于编码的基础编码。例如,在ASCII中,'B' < 'a',因为'B'编码为66,'a'为97.如果这些字符都是相同大小写的字母,这将相当于所有(非多字节)编码I中的字母顺序我很熟悉,但我不相信这是必需的。

对于像“grass”和“grapes”这样的情况,它会继续扫描,直到找到不同的字符(在本例中为'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; 
} 
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