【发布时间】:2011-01-25 04:14:17
【问题描述】:
我正在尝试比较两个字符串。一个存储在文件中,另一个从用户 (stdin) 中检索。
这是一个示例程序:
int main()
{
char targetName[50];
fgets(targetName,50,stdin);
char aName[] = "bob";
printf("%d",strcmp(aName,targetName));
return 0;
}
在此程序中,当输入为 "bob" 时,strcmp 返回值 -1。
为什么是这样?我认为他们应该是平等的。我怎样才能得到它,使他们是?
【问题讨论】:
-
你应该避免使用
strcmp。请改用strncmp,尤其是在与固定宽度字符串进行比较时。在这里使用strncmp(aName,targetName,strlen(aName))应该适合你。 -
bta 的评论是错误的——如果要检查前缀而不是整个字符串,请使用 strncmp,例如。 "bobcat" 也会匹配。
-
我这么说是因为
strcmp将继续比较,直到达到 NULL 终止符或字符串不同。如果您不能确定您的字符串将始终正确地以 NULL 结尾,strcmp可能会引入缓冲区溢出和内存访问冲突。strncmp不仅仅用于读取前缀;将最终参数设置为固定长度缓冲区的大小,以确保不会溢出数组边界。 -
bta-您的原始评论说使用
strlen来计算strncmp的大小参数。这样做不会增加strcmp没有的额外保护。使用固定大小值(例如您的第二条评论指出的缓冲区大小)是应该使用strncmp的时间。
标签: c string input fgets strcmp