【问题标题】:How to compare strings in C for a condition [duplicate]如何在C中比较字符串的条件[重复]
【发布时间】:2013-01-24 14:31:19
【问题描述】:

我在比较 C 中的两个字符串以查看它们是否相等时遇到了麻烦。

switch(i) {
case 1:
  printf("Got in case 1.  TextA=%s    word=%s \n",TextA,word);
  if(TextA == word) {       
    SubTypeOption = 1;
    printf("SubTypeOptioon = %d",SubTypeOption);
  }

在我的输出中,我得到“万一 1. TextA=SupTypeA word=SupTypeA SubTypeOption = 0" //所以它没有以某种方式改变

【问题讨论】:

  • 谢谢大家,现在似乎可以工作了。

标签: c string


【解决方案1】:

您不能将字符串(或任何其他数组类型)的内容与标准关系运算符(如 ==<> 等)进行比较。您需要改用 strcmp 库函数:

#include <string.h>
...
if (strcmp(TextA, word) == 0)
{
  // strings are equal
}

strcmp 如果TextA 在字典上小于word,则返回一个整数值TextA 在字典上大于word,则返回> 0。

请注意,在 C 语言环境中,这意味着字符串将按“ASCII 顺序”排序;也就是说,任何以'a' 开头的字符串都将出现在以'Z' 开头的字符串之后,因为'a' 的ASCII 码大于'Z'

那么为什么不能使用== 来比较字符串呢?

除非它是 sizeof_Alignof 或一元 &amp; 运算符的操作数,或者是用于在声明中初始化数组的字符串字面量,“N 元素数组”类型的表达式的T”将被转换为“指向T”类型的表达式,其值将是数组第一个元素的地址。

这意味着,在条件TextA == word 中,表达式TextAword 都被转换为指针值;我们不是比较两个数组的内容,而是比较它们的地址。

【讨论】:

    【解决方案2】:
    switch(i) {
    case 1:
      printf("Got in case 1.  TextA=%s    word=%s \n",TextA,word);
      if(strcmp(TextA,word)==0) {       //something like that
        SubTypeOption = 1;
        printf("SubTypeOptioon = %d",SubTypeOption);
      }
    

    http://www.cplusplus.com/reference/cstring/strcmp/

    【讨论】:

      【解决方案3】:

      简单 - 使用 strcmp - 这就是您需要的功能。

      【讨论】:

        【解决方案4】:

        您不能使用== 符号比较字符串,因为您正在比较它们是否放置在相同的内存位置。 TextAword 是指向每个 c-string 的第一个字符的指针。

        使用strcmp()strlcmp() 函数来比较字符串。如果两个字符串相等,它们将返回 0

        #define STREQ(a,b) (strcmp((a),(b))==0)
        if (STREQ(TextA, word)){
        
        }
        

        【讨论】:

          【解决方案5】:

          == 运算符比较指针。只有当两个char* 指向内存中的相同地址时,它才会成功。在 C 中比较字符串的 content 需要调用 strcmpstrncmp

          if (strcmp(TextA, word) == 0) {
              // Strings are identical
          }
          

          注意与零的比较:这是必需的,因为strcmp 函数比较字符串按字典顺序,当字符串相等时返回零。您需要包含&lt;strings.h&gt; 才能使用strcmp

          【讨论】:

            【解决方案6】:

            使用strcmp

            不是“==”运算符

            http://www.cplusplus.com/reference/cstring/strcmp/

            【讨论】:

              猜你喜欢
              • 2018-07-09
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-09-28
              相关资源
              最近更新 更多