1

我在比较 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);
  }

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

4

6 回答 6

6

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

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

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

于 2013-02-08T18:36:44.827 回答
5

利用strcmp

不是 '==' 运算符

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

于 2013-02-08T18:36:37.337 回答
2

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

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

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

}
于 2013-02-08T18:36:54.513 回答
1

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

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

strcmpTextA如果按字典顺序小于,则返回整数值 < 0,如果按字典word顺序相等,则返回 0,如果按字典顺序大于 ,则返回 > TextA0 word

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

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

除非它是sizeof, _Alignof, 或一元运算符的操作数&,或者是用于在声明中初始化数组的字符串文字,“N-element array of T”类型的表达式将被转换为“pointer”类型的表达式to T",其值将是数组第一个元素的地址。

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

于 2013-02-08T19:17:39.200 回答
1

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

于 2013-02-08T18:37:24.217 回答
0
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/

于 2013-02-08T18:37:45.153 回答