如何检查值是否与string匹配
在这里学C的主要思想是冰冻的。
我有一个像这样的结构:
char *sname; ........ players[i].sname
等于“詹姆斯”。
我需要检查值之间的平等,如下所示:
if (players[i].sname == 'Lee')
但没有太多的运气。 是否有我应该使用的str函数,或者是否有修复我的if语句。 这不是atm工作。
简短的回答: strcmp()
。
长答案:所以你有这个:
if(players[i].sname == 'Lee')
这在几个方面是错误的。 首先,单引号表示C中的“字符字面量”而不是“string字面量”
其次,更重要的是, "string1" == "string2"
不比较string,它比较char *
s或指向字符的指针。 它会告诉你两个string是否存储在同一个内存位置 。 这意味着他们是平等的,但一个错误的结果并不意味着他们是不平等的 。
strcmp()
将基本上通过并比较string中的每个字符,停止在不相等的第一个字符,并返回两个字符之间的差异(这就是为什么你必须说strcmp() == 0
或!strcmp()
相等)。
还要注意函数strncmp()
和memcmp()
,它们与strcmp()
类似,但是更安全。
你应该使用strcmp()
:
if (strcmp(players[i].sname, "Lee") == 0) { ...
还要注意C中的string被双引号包围: ""
。 单个字符被单引号括起来: ''
。 我不确定你的编译器可能会用'Lee'
来做什么,但几乎肯定不是你想要的。
你会从头文件<string.h>
寻找strcmp()
。
请注意,您需要一个string – 'Lee'
不是一个string,而是一个多字符常量,这是允许的但很less有用的,不仅仅是因为表示法是由编译器定义的,而不是由C标准定义的。
如果你想比较两个string – first
和second
调用指针,那么你写:
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()
,这是在一个答案中build议的。 如果你有:
if (strncmp(first, "command", 7) == 0)
那么如果first
包含"commander"
,则该比赛将是有效的。 如果这不是你想要的,但是你想使用strncmp()
,你会写:
if (strncmp(first, "command", sizeof("command")) == 0)
这将正确拒绝"commander"
。