【问题标题】:String compare in CC中的字符串比较
【发布时间】:2015-11-17 23:11:32
【问题描述】:

我对 C 中的字符串比较 strcmp() 函数有点困惑。

当您有两个字符串grassgrapes 并使用strcmp(grass, grapes); 得到39 或任何正数时,这是否意味着“grapes”在“grass”之前按字母顺序排列,还是相反?

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

【问题讨论】:

  • 你的意思是strcmp("grass", "grapes")?如果小于零草排在葡萄之前,如果等于0,它们相等,如果大于零葡萄排在草之前。跨度>
  • 看看this link。在返回值下
  • 如果你在 linux 上,你可以使用man strcmp

标签: c strcmp alphabetical


【解决方案1】:

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

如果你把 a 换成 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

【讨论】:

    【解决方案2】:

    strcmp的返回值在C99 7.21.4中定义

    比较函数 memcmp、strcmp、 strncmp 由第一个值之间的差异的符号确定 对象不同的一对字符(均解释为无符号字符) 比较的。 所以如果结果是肯定的,这意味着第二个参数在第一个参数之后。

    这不完全是字母顺序,而是取决于字符的底层编码。例如,在 ASCII 中,'B' &lt; 'a',因为 'B' 被编码为 66 而 'a' 是 97。如果字符都是相同大小写的字母,这将等同于所有字母顺序(非多字节)我熟悉的编码,但我认为这不是必需的。

    对于像“grass”和“grapes”这样的情况,它会一直扫描直到找到不同的字符(在这种情况下是's' vs 'p'),然后做出决定。一种特殊情况是当一个字符串是另一个字符串的子字符串时:例如“葡萄”与“葡萄”。对于这种情况,您只需要记住“grape”实际上是{ 'g', 'r', 'a', 'p', 'e', '\0' },并应用正常规则:'\0' &lt; 's',因此“grape”位于“grapes”之前。

    这将是 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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-19
      • 2016-02-08
      • 2013-11-22
      • 1970-01-01
      相关资源
      最近更新 更多