C 如何检查值是否与字符串匹配
我这里有一个结构,类似于:C 如何检查值是否与字符串匹配,c,C,我这里有一个结构,类似于: char *sname; ........ players[i].sname 相当于“詹姆斯” 我需要检查值之间是否相等,如下所示: if (players[i].sname == 'Lee') 但是我运气不太好。是否有我应该使用的str*函数,或者是否有任何方法来修复我的if语句?您应该使用: 还要注意,C中的字符串被双引号包围:“”。单个字符用单引号括起来:'。我不确定您的编译器可能正在使用'Lee'执行什么操作,但这几乎肯定不是您想要的。您将从标题中查找st
char *sname;
........
players[i].sname
相当于“詹姆斯”
我需要检查值之间是否相等,如下所示:
if (players[i].sname == 'Lee')
但是我运气不太好。是否有我应该使用的str*
函数,或者是否有任何方法来修复我的if
语句?您应该使用:
还要注意,C中的字符串被双引号包围:
“
”。单个字符用单引号括起来:'
。我不确定您的编译器可能正在使用'Lee'
执行什么操作,但这几乎肯定不是您想要的。您将从标题
中查找strcmp()
请注意,您需要一个字符串-“Lee”不是一个字符串,而是一个多字符常量,这是允许的,但很少有用,因为表示是由编译器定义的,而不是由C标准定义的
如果要比较两个字符串-首先调用指向它们的指针和第二个,然后编写:
if (strcmp(first, second) == 0) // first equal to second
if (strcmp(first, second) <= 0) // first less than or equal to second
if (strcmp(first, second) < 0) // first less than second
if (strcmp(first, second) >= 0) // first greater than or equal to second
if (strcmp(first, second) > 0) // first greater than second
if (strcmp(first, second) != 0) // first unequal to second
在我看来,它们的优点是简洁,但缺点是没有与零进行明确的比较清楚
请谨慎使用strncmp()
而不是strcmp()
,这是一个答案中建议的。如果您有:
if (strncmp(first, "command", 7) == 0)
然后,如果第一个
包含“指挥官”
,则匹配将有效。如果这不是您想要的,但您仍然想使用strncmp()
,您可以编写:
if (strncmp(first, "command", sizeof("command")) == 0)
这将正确地拒绝“指挥官”
简短回答:
答案很长:你得到了这个:
if(players[i].sname == 'Lee')
这在几个方面是错误的。首先,单引号在C中的意思是“字符文字”而不是“字符串文字”
其次,更重要的是,“string1”==“string2”
不比较字符串,而是比较char*
s或字符指针。它将告诉您两个字符串是否存储在同一个内存位置。这意味着他们是平等的,但错误的结果并不意味着他们是不平等的
strcmp()
基本上会遍历并比较字符串中的每个字符,在不相等的第一个字符处停止,并返回两个字符之间的差异(这就是为什么必须说strcmp()==0
或!strcmp()
表示相等的原因)
还要注意函数和,它们类似于strcmp()
,但更安全。请注意,您需要使用双引号字符串,而不是单引号多字符常量。是的,我想我会留待其他人学习。请注意,在这一问题多年后,人们提出了一个本质上重复的问题。我也非常感谢你——我知道有些事情根本就不对劲。当您不知道许多部分中哪个部分出错时,很难实际查找:p编译器可能会生成编号0x004c6565
。我不确定多字节字符在C89中是否合法,但我非常确定它们是C99的一部分。多字符整数常量在C89及更高版本中合法,但其值由实现定义。ISO/IEC 9899:2011§6.4.4.4字符常量:^10…包含多个字符(例如,'ab'
)或包含不映射到单字节执行字符的字符或转义序列的整数字符常量的值由实现定义…该措辞在C89中基本相同。(有趣的是,C89在最初的描述中有一个示例'ab'
;C99和C11都删除了多字符常量的早期示例。)
if (strncmp(first, "command", sizeof("command")) == 0)
if(players[i].sname == 'Lee')