我在这里有一个类似的结构:
char *sname;
........
players[i].sname
等于“詹姆斯”。
我需要检查值之间是否相等:
if (players[i].sname == 'Lee')
但是运气不好。是否有str*
函数我应该使用或者是否仍然可以修复我的if
声明?
答案 0 :(得分:8)
您应该使用strcmp()
:
if (strcmp(players[i].sname, "Lee") == 0) { ...
另请注意,C中的字符串用双引号括起来:""
。单个字符由单引号括起:''
。我不确定你的编译器可能正在使用'Lee'
做什么,但几乎肯定不是你想要的。
答案 1 :(得分:8)
答案简短:strcmp()
。
答案很长:所以你有这个:
if(players[i].sname == 'Lee')
这在几个方面都是错误的。首先,单引号在C中表示“字符文字”而不是“字符串文字”。
其次,更重要的是,"string1" == "string2"
不比较字符串,它比较char *
s或指向字符的指针。它会告诉您两个字符串是否存储在同一个内存位置。这意味着他们是平等的,但错误的结果并不意味着他们不平等。
strcmp()
基本上会通过并比较字符串中的每个字符,停在第一个不相等的字符,并返回两个字符之间的差异(这就是为什么你要说{{1} }}或strcmp() == 0
表示相等。)
答案 2 :(得分:3)
您要从标题strcmp()
中寻找<string.h>
。
请注意,您需要一个字符串 - 'Lee'
不是字符串而是多字符常量,这是允许但很少有用,尤其是因为表示由编译器定义,而不是C标准。 / p>
如果你想比较两个字符串 - 调用它们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()
,这是在一个答案中提出的。如果你有:
if (strncmp(first, "command", 7) == 0)
如果first
包含"commander"
,则匹配有效。如果那不是你想要的,但你想要使用strncmp()
,你会写:
if (strncmp(first, "command", sizeof("command")) == 0)
这将正确拒绝"commander"
。
答案 3 :(得分:0)
strcmp 工作正常,前提是其中一个字符串以空字符结尾。如果两者都是最大长度且相同,则比较将结束,并且很可能会为相等性测试提供假阴性结果。如果一个字符串被固定在 strcmp 本身的 "" 标记内,那不是问题,因为我们知道它是空终止的。
如果我们比较两个字符串变量,并且不知道它们是否是最大长度(最大长度的不是空终止),那么我们需要使用strncmp,并在其中之一上使用sizeof来得到第三个参数。这解决了问题,因为 sizeof 知道最大长度。如果字符串之一是双引号中的文字,则 strcmp 是 100% 安全的。