比较两个字符串,strcmp的问题

我正在尝试检查从stdin读取的行是否以“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:”之后会发生什么,我只是想确定命令是如何给出的。 我究竟做错了什么?

如果两个字符串完全相同,则strcmp返回0以完成您想要执行的操作

使用 :

strstr(s2 , "login:")

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

要么

strncmp(s2 , "login:" , 6)

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

C中的每个字符串都是一个空终止符,如图所示

当字符串结束时。

现在,你正在复制从s1到s2的6个字母,即

 login: 

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

所以s2并不像你想要的那样“登录:”。

所以我建议使用

 strstr(s2, "login:") 

检查登录:是否包含在s2中。

 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") 

c中的字符串库包含两个函数strcmp(s1,s2)strcmpi(s1,s2)strcmp函数无法按长度比较字符串。 它比较字符串的第一个字符的ascii值,如果我提供s1="Login"并且s2="Sign out"则返回负值,因为’L’的ascii小于’S’的ascii。 如果第一个字符与第二个字符相同。