如何检查值是否与字符串匹配

时间:2009-10-21 02:23:34

标签: c

我在这里有一个类似的结构:

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

等于“詹姆斯”。

我需要检查值之间是否相等:

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

但是运气不好。是否有str*函数我应该使用或者是否仍然可以修复我的if声明?

4 个答案:

答案 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表示相等。)

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

答案 2 :(得分:3)

您要从标题strcmp()中寻找<string.h>

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

如果你想比较两个字符串 - 调用它们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"

答案 3 :(得分:0)

strcmp 工作正常,前提是其中一个字符串以空字符结尾。如果两者都是最大长度且相同,则比较将结束,并且很可能会为相等性测试提供假阴性结果。如果一个字符串被固定在 strcmp 本身的 "" 标记内,那不是问题,因为我们知道它是空终止的。

如果我们比较两个字符串变量,并且不知道它们是否是最大长度(最大长度的不是空终止),那么我们需要使用strncmp,并在其中之一上使用sizeof来得到第三个参数。这解决了问题,因为 sizeof 知道最大长度。如果字符串之一是双引号中的文字,则 strcmp 是 100% 安全的。