如何比较C中的字符串条件
我在比较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字= SupTypeA SubTypeOption = 0”//所以它没有被改变
==
运算符比较指针 。 只有当两个char*
指向内存中的相同地址时,它才会成功。 比较C中字符串的内容需要调用strcmp
或strncmp
:
if (strcmp(TextA, word) == 0) { // Strings are identical }
注意比较为零:它是必需的,因为strcmp
函数按字典顺序比较字符串,当字符串相等时返回零。 您需要包含
才能使用strcmp
。
您无法使用==
符号比较字符串,因为您正在比较它们是否放在同一个内存位置。 TextA
和word
是指向每个c字符串的第一个字符的指针。
使用strcmp()
或strlcmp()
函数来比较字符串。 如果两个字符串相等,它们将返回0
#define STREQ(a,b) (strcmp((a),(b))==0) if (STREQ(TextA, word)){ }
简单 – 使用strcmp – 这是您需要的function。
您无法将字符串(或任何其他数组类型)的内容与标准关系运算符(如==
, <
, >
等)进行比较。您需要使用strcmp
库函数:
#include ... if (strcmp(TextA, word) == 0) { // strings are equal }
如果TextA
在字典上小于word
,则strcmp
将返回一个整数值,如果它们在词典上相等,则返回0;如果TextA
在词典上大于word
,则TextA
> 0。
请注意,在C语言环境中,这意味着字符串将按“ASCIIbetically”排序; 也就是说,任何以'a'
开头的字符串都将出现在以'Z'
开头的字符串之后,因为'a'
的ASCII代码大于'Z'
。
那你为什么不能用==
来比较字符串呢?
除非它是sizeof
, _Alignof
或一元&
运算符的操作数,或者是用于在声明中初始化数组的字符串文字,否则“N元素数组T
”的表达式将转换为表达式类型为“指向T
指针”,其值将是数组的第一个元素的地址。
这意味着,在条件TextA == word
, TextA
和word
这两个表达式都被转换为指针值; 我们不是比较两个数组的内容,而是比较它们的地址。
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); }