比较两个字符串,使用strcmp函数出现问题

4
我正在尝试检查从stdin读取的行是否以“login:”开头,但strcmp似乎不起作用。
我想确认输入的第一行是否为“login:”,但是strcmp函数好像无法正常工作。
char s1[20], s2[20];
fgets(s1, 20, stdin);
strncpy(s2,s1,6);
strcmp(s2, "login:");
if( strcmp(s2, "login:") == 0)
    printf("s2 = \"login:\"\n");
else
    printf("s2 != \"login:\"\n");

我不在意"login:"后面的内容,我只想确认这个命令是这样使用的。我做错了什么?

1
strcmp 用于精确匹配。我建议浏览C字符串库,看看是否有其他函数可用于此任务... - Oliver Charlesworth
我正在将前6个字符(应为“login:”)复制到另一个字符串中,该字符串将与字符串“login:”进行比较,因此我正在寻找完全匹配。 - Barsan Ionut
哦,那是一个很好的观点;我没有注意到。 - Oliver Charlesworth
4个回答

6

strcmp函数会在两个字符串完全相同时返回0,以完成你想要实现的功能。

使用如下代码:

strstr(s2 , "login:")

(如果字符串在s2中不存在,则它将返回NULL)

或者

strncmp(s2 , "login:" , 6)

这将比较前6个字符(如果s2以"login:"开头,则会返回0)


1
在C语言中,每个字符串都后跟一个空终止符,以表示字符串的结束。
目前,您正在将s1中的6个字母复制到s2中。
login:

这意味着您没有复制空终止符。
因此,s2并不会像您想要的那样完全成为“login:”。
因此,我建议使用。
strstr(s2, "login:")

检查是否在s2中包含“login:”字符串。

0
char s1[20], s2[20];
fgets(s1, 20, stdin);
strncpy(s2,s1,6);
strcmp(s2, "login:");
if( strcmp(s2, "login:") == 0)
    printf("s2 = \"login:\"\n");
else
    printf("s2 != \"login:\"\n");

您将字符串与“login”进行比较,其中包含以下字符:'l''o''g''i''n'':''\0'。因此,如果字符串相等,则s2中必须有一个'\0'。以下代码应该可以正常工作:

char s1[20], s2[20];
fgets(s1, 20, stdin);
strncpy(s2,s1,6);
s2[6]='\0'; //end of String
strcmp(s2, "login:");
if( strcmp(s2, "login:") == 0)
    printf("s2 = \"login:\"\n");
else
    printf("s2 != \"login:\"\n")

-1

C语言中的字符串库<string.h>包含两个函数strcmp(s1,s2)strcmpi(s1,s2)strcmp函数不能通过长度比较字符串。 它比较字符串的第一个字符的ASCII值,如果我提供s1="Login"s2="Sign out",那么它返回负值,因为'L'的ASCII值小于'S'的ASCII值。 如果第一个字符相同,则继续检查第二个字符。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接