4

我正在尝试检查从标准输入读取的行是否以“登录:”开头,但 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");

我不在乎“登录:”之后会发生什么,我只是想确保这是命令的给出方式。我究竟做错了什么?

4

4 回答 4

6

strcmp如果两个字符串完全相同以完成您想要做的事情,则返回 0

利用 :

strstr(s2 , "login:")

NULL如果字符串不存在则返回s2

或者

strncmp(s2 , "login:" , 6)

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

于 2013-10-20T15:38:41.217 回答
1

C中的每个字符串后面都是一个空终止符,这表明

当字符串结束时。

现在,您将 6 个字母从 s1 复制到 s2,即

login:

这意味着您没有复制空终止符。

所以 s2 并不完全是你想要的“登录:”。

所以我建议宁愿使用

strstr(s2, "login:")

检查 login: 是否包含在 s2 中。

于 2013-10-20T15:41:25.457 回答
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");

您将您的字符串与包含以下字符的“登录”进行比较:'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")
于 2013-10-20T15:47:52.293 回答
-1

<string.h>c 中的字符串库包含两个函数strcmp(s1,s2)strcmpi(s1,s2). strcmp函数不能按长度比较字符串。它比较字符串的第一个字符的 ascii 值,如果我提供s1="Login"s2="Sign out"然后返回负值,因为“L”的 ascii 小于“S”的 ascii。如果第一个字符与检查第二个字符相同。

于 2018-06-22T12:32:32.860 回答