【问题标题】:C programming language: Behavior of strcmp(str1, str2)C 编程语言:strcmp(str1, str2) 的行为
【发布时间】:2010-04-19 17:00:47
【问题描述】:

在 C 中,我有一个字符数组:

d[20] 

它被赋值为 'if' 并带有一个空终止字符:

d[0]='i'
d[1]='f'
d[2]='\0'

strcmp(d,"if") 的值应该为 0 吗?为什么?

我希望strcmp 返回值 0。当我运行它时,我得到的值是 -1

【问题讨论】:

  • 因在标准库函数中假设错误而被否决。始终假设您的代码有问题,而不是库。并发布代码。
  • @mekasperasky:当您认为您在编译器或标准库中发现错误时,您可以这样做:1) 将问题归结为 20 行代码的可编译程序来重现问题. 2)您将该示例发布在一个可以粘贴到编辑器中、编译和测试的示例中。 3)您使用用于重现问题的编译器/标准库版本伴随程序。 - IME 第 1 步将在 98% 的情况下显示 your 错误。在第 2 步引起的 1.98% 的批评中也会发现 your 错误。将剩余的 0.2% 报告给供应商,使用您的再现程序作为证据。
  • @sbi,你认为它高达0.2%?当我以前在 comp.lang.c 中闲逛时,我会说它更像是 0.0001%。
  • @Michael Burr:mekasperasky 在评论中说“/0”是一个错字,这让我不知道发生了什么。如果没有真实的代码示例和运行报告,这个问题就无法回答,我没有看到。
  • @David Thornley:我明白了 - 这是一个令人困惑的情况。我们将看看 mekasperasky 是否澄清(希望从实际代码中复制粘贴)。

标签: c strcmp


【解决方案1】:

如果您的意思是d[0] = 'i'; d[1] = 'f'; d[2] = '\0';,那么是的,应该返回0。d[2] = '/0' 将分配完全不同的东西,并且您的字符串不会以空值结尾。至少不是你期望的那样——strcmp 可能会进入杂草并开始吸泥。

【讨论】:

    【解决方案2】:

    @everyone:@Mark 在编辑原始问题时引入了“/0”错字。原件有正确的'\0'。您的大多数答案(以及关于 OP 的假设)都是错误的。

    @mekasperasky 下面的代码正确地产生了0 的值。如果您可以将其与您的个人代码进行比较并发现差异,那么您可能已经解决了自己的问题。

    int main(int argc, char* argv[])
    {
       char d[20] = {0};
       d[0] = 'i';
       d[1] = 'f';
       d[2] = '\0';
    
       int value = strcmp(d,"if");
       cout << value << endl;
       return 0;
    }
    

    【讨论】:

      【解决方案3】:

      d[2] 应该是 '\0',而不是 '/0'

      【讨论】:

        【解决方案4】:

        空值用以下方式表示:

        d[2]='\0'
        

        而不是你写的 /0。

        【讨论】:

          【解决方案5】:

          正如其他答案所提到的,'/0' 不是空终止字符,'\0' 是。

          您可能认为在字符文字中指定多个字符可能会产生错误;不幸的是(至少在这种情况下)C 允许“多字符”文字字符 - 但多字符文字的确切行为是实现定义的(6.4.4.4/2“字符常量”):

          整数字符常量的类型为 int。包含映射到单字节执行字符的单个字符的整数字符常量的值是被解释为整数的映射字符表示的数值。包含多个字符(例如,'ab')或包含不映射到单字节执行字符的字符或转义序列的整数字符常量的值是实现定义的。

          所以你的'/0' 'character' 最终是一些实现定义的 int 值,当存储在d[2] 中时会被截断。您的编译器可能会针对“多字符”文字生成警告,但这也可能取决于您为编译器提供的确切选项。

          例如,我从 GCC 收到以下警告(我碰巧设置了 -Wall):

          C:\temp\test.cpp:6:14: warning: multi-character character constant
          

          在我对 MSVC 和 MinGW 的测试中,'/0' 的值是0x00002f30,所以d[2] = '/0' 最终等于d[2] = '0'

          【讨论】:

            【解决方案6】:

            这适用于我拥有的每个 C 编译器。我没想到会有所不同。它也适用于Codepad

            这适用于您的 C 编译器吗?

            #include <stdio.h>
            #include <string.h>
            
            char d[20];
            
            int main(void) {
               d[0]='i';
               d[1]='f';
               d[2]='\0';
            
               printf("Value of strcmp=%i\n\n",strcmp(d,"if"));  /* will print 0 */
            
               return 0;
            }
            

            【讨论】:

              猜你喜欢
              • 2010-09-16
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-05-14
              • 2013-08-16
              • 1970-01-01
              • 2013-11-13
              • 2020-11-14
              相关资源
              最近更新 更多