【问题标题】:What does strcmp() exactly return in C?strcmp() 在 C 中究竟返回了什么?
【发布时间】:2016-04-21 20:38:02
【问题描述】:

我用 C 写了这段代码:

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

int main()
{
    char string1[20];
    char string2[20];
    strcpy(string1, "Heloooo");
    strcpy(string2, "Helloo");
    printf("%d", strcmp(string1, string2));
    return(0);
}

控制台是否应该打印值 1 或 ASCII 值之间的差异 o\0 字符即 111?在this website 上写着这应该输出 111,但是当我在笔记本电脑上运行它时,它显示 1。为什么?

【问题讨论】:

  • strcmp 返回 -1(小于 0)、0(等于)或 1(大于 0)。找出这一点的一种方法是谷歌man strcmp。注意:1) 您的“网站”错误。 2) strcmp() 需要一个 C 字符串(一个以 null 结尾的字符数组); 不是单独的“char”值。
  • 这取决于实现。
  • @paulsm 你的答案不正确。如果它给出 -1 它也可能给出 ascii 值的差异,这取决于实现
  • @Peter Miehl3。我从未见过或听说过提供除 0、 0 以外的任何值的实现。我不相信你,但是... 问:你能引用一个链接吗?

标签: c string strcmp


【解决方案1】:

基本上,strcmp() 可以返回以下内容:

  • &gt; 0 如果第二个字符串小于第一个字符串。

    char s1, s2;
    strcpy (s1, "helloworld");
    strcpy (s2, "world");
    int check = strcmp (s1, s2);
    
  • 0 如果传递的字符串相同。

    char s1, s2;
    strcpy (s1, "hello");
    strcpy (s2, "hello");
    int check = strcmp (s1, s2);
    

    在这种情况下,由于字符串相等,检查将有0

  • &lt; 0 如果第一个字符串小于第二个字符串。

    char s1, s2;
    strcpy (s1, "hello");
    strcpy (s2, "worldhello");
    int check = strcmp (s1, s2);
    

因此,在您的情况下,strcmp () 将返回 1,因为字符串不相等。

查看thisthis 关于strcmp () 的教程。

【讨论】:

    【解决方案2】:

    strcmp 如果 string1 按字母顺序小于 string2,则返回 '小于 0'的值zero,如果它们相等;如果字符串 1 按字母顺序大于字符串 2,则 '值大于 0'

    【讨论】:

      【解决方案3】:
      int strcmp(const char *str1, const char *str2)
      

      将返回一个小于、等于或大于 0 的值。如果返回 0,则表示两个字符串相等,如果返回小于 0 的值,则表示 str1 小于 str2。如果返回值 > 0,则表示 str2 小于 str1。

      您的返回值为 1,因为“Heloooo”比“Helloo”多一个字符。 事实上,Helloo 这个词有 6 个字符,Heloooo 有 7 个字符。正好多了一个字符。

      【讨论】:

        【解决方案4】:

        来自the cppreference.com documentation

        int strcmp( const char *lhs, const char *rhs );
        

        返回值

        • 如果 lhs 按字典顺序出现在 rhs 之前,则为负值。

        • 如果 lhs 和 rhs 比较相等,则为零。

        • 如果 lhs 按字典顺序出现在 rhs 之后,则为正值。

        如您所见,它只是表示负数、零或正数。你不能指望别的。

        您链接的网站不正确。它告诉您返回值是&lt; 0== 0&gt; 0,它给出了一个示例并显示了它的输出。它没有告诉输出应该是 111

        【讨论】:

        • 那么,返回值会是-1、0、1吗?或者它可以是其他值?
        • @c-分别为任何“负值”、“零”和任何“正值”
        • 那么,值是多少?它是如何确定价值的?
        • @c-值是什么并不重要。该标准并没有故意强加一定的价值。这是实施。有些只是返回 -1 01,有些可能会做一些优化并返回差异。在问题的 cmets 中,您有一些指向某些实现的链接,这些实现返回第一对不匹配的字符之间的差异。
        【解决方案5】:

        输出取决于实现。 strcmp 函数的一个不错的实现是:

        int strcmp (const char * s1, const char * s2)
        {
            for(; *s1 == *s2; ++s1, ++s2)
                if(*s1 == 0)
                    return 0;
            return *(unsigned char *)s1 < *(unsigned char *)s2 ? -1 : 1;
        }
        

        如果 s1 s2 则返回 1,如果 s1 = s2 则返回 0。
        但通常情况下,会有一个更快的版本用于实际使用:

        int strcmp (const char * s1, const char * s2)
        {
            for(; *s1 == *s2; ++s1, ++s2)
                if(*s1 == 0)
                    return 0;
            return *(const unsigned char *)s1 - *(const unsigned char *)s2;
        }
        

        请注意,这更快,因为它跳过了之前完成的分支。因此,我们通常有一个约定,负返回值表示s1 在字典上小于s2,正值表示反之亦然。

        【讨论】:

        • 从历史上看,这可能是一个原因,但优化编译器通常能够避免在第一个版本中出现额外的分支。第一个版本可能仍然快几个周期,但这种差异可以忽略不计。库中的实际 strcmp 将得到更大幅度的优化,请参阅 stackoverflow.com/questions/44874690/…
        【解决方案6】:

        引用手册页:

        如果 s1(或其前 n 个字节)分别小于、匹配或等于大于 s2。

        换句话说,您永远不应该依赖strcmp 的确切返回值(当然,0 除外)。唯一的保证是,如果第一个字符串“更小”,则返回值为负,如果第一个字符串“更大”,则返回值为正,如果它们相等,则返回值为 0。相同的输入可能会在不同的平台上使用strcmp 的不同实现产生不同的结果。

        【讨论】:

          猜你喜欢
          • 2011-07-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-02-11
          • 2017-05-06
          • 2013-06-30
          相关资源
          最近更新 更多