比较两个字符串,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。 如果第一个字符与第二个字符相同。