我正在尝试比较两个字符串。其中一个字符串存储在文件中,另一个字符串从用户(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))
应该适合你。 - btastrcmp
会一直比较直到遇到NULL终止符或者字符串不同。如果你不能确定你的字符串总是被正确地NULL终止,strcmp
可能会引起缓冲区溢出和内存访问违规。strncmp
不仅仅用于读取前缀;将最后一个参数设置为你固定长度缓冲区的大小,以确保你不会溢出数组边界。 - btastrlen
来计算strncmp
的大小参数。这样做并没有比strcmp
已经具有的额外保护更多的保护作用。当使用固定大小值,例如缓冲区大小时,应该使用strncmp
,正如你第二个评论所指出的那样。 - bboe