2009-10-21 99 views
2

这里学习C时主要的脑冻结。如何检查值是否与字符串匹配

我在这里有一个结构的东西,如:

char *sname; 
........ 
players[i].sname 

等于 “詹姆斯”。

我需要像这样的值之间检查平等:

if (players[i].sname == 'Lee') 

,但我运气不好。是否有我应该使用的str函数,或者无论如何修复我的if语句。这不是atm工作。

+3

请注意,您需要使用双引号字符串而不是单引号多字符常量。 – 2009-10-21 02:27:12

+0

是的 - 我会留下来让别人学习我的设想。 – 2009-10-21 03:27:40

+0

请注意,有一个本质上重复的问题[我如何正确比较字符串在C](http://stackoverflow.com/questions/8004237/how-do-i-properly-compare-strings-in-c)这是在此之后几年问。还有[为什么'strcmp()'当它的输入相等时返回0](http://stackoverflow.com/questions/595450/why-does-strcmp-return-0-when-its-inputs-are-equal ) – 2017-02-10 05:22:12

回答

7

简短回答:strcmp()

长的答案:所以,你有这样的:

if(players[i].sname == 'Lee') 

这是错误的在几个方面。首先,单引号表示C中的“字符字面量”而不是“字符串字面量”。其次,更重要的是,"string1" == "string2"不比较字符串,它比较char *或指向字符的指针。它会告诉你两个字符串是否存储在相同的内存位置。这将意味着他们是平等的,但一个错误的结果并不意味着他们不等于

strcmp()将基本经历和在串的每个字符比较,停在那不等于第一个字符,并返回两个角色之间的差别(这就是为什么你必须说平等strcmp() == 0!strcmp()) 。

还请注意功能strncmp()memcmp(),它们与strcmp()类似,但更安全。

+0

非常感谢 - 我知道存在根本性错误。当你不知道哪个部分是错误的,很难真正查看它:P – 2009-10-21 02:45:33

8

您应该使用strcmp()

if (strcmp(players[i].sname, "Lee") == 0) { ... 

还要注意的是,在C字符串被双引号括起来:""。单个字符被单引号包围:''。我不确定你的编译器可能会用'Lee'做什么,但它几乎肯定不是你想要的。

+0

编译器可能会生成数字“0x004c6565”。我不确定多字节字符在C89中是否合法,但我很确定它们是C99的一部分。 – 2009-10-21 02:51:56

+0

多字符整数常量在C89及更高版本中是合法的,但它们的值是实现定义的。 ISO/IEC 9899:2011§6.4.4.4字符常量:_¶10...包含多个字符的整数字符常量的值(例如, ''ab''),或者包含不包含字符或转义序列的值映射到单字节 执行字符,是实现定义的。 ......在C89中的措辞基本上是相同的。 (有趣的是,C89在初始描述中有一个'ab''的例子; C99和C11都删除了多字符常量的早期例子。) – 2017-02-10 05:39:54

3

您会从标头<string.h>寻找strcmp()

请注意,您需要一个字符串 - 'Lee'不是一个字符串,而是一个多字符常量,这是允许的但很少用到的,不仅仅是因为该表示由编译器定义,而不是C标准。

如果您正在寻找比较两个字符串 - 调用指向他们firstsecond,那么你就写:

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 

这,在我看来,这使得它清楚的比较等符号应该使用。请注意,strcmp()可能会返回任何负值以指示“小于”或任何正值来指示“大于”。

谨慎使用strncmp()而不是strcmp(),这是在一个答案中提出的。如果您有:

if (strncmp(first, "command", 7) == 0) 

那么如果first包含"commander",本场比赛将是有效的。如果这不是你想要什么,但你想使用strncmp()无论如何,你可以这样写:

if (strncmp(first, "command", sizeof("command")) == 0) 

这将正确地拒绝"commander"

相关问题