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

比较两个字符串,发现strcmp的问题,c,strcmp,strcpy,C,Strcmp,Strcpy,我试图检查从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:”之后会发生什么,

我试图检查从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,“登录:”)

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

strncmp(s2,“登录:”,6)


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

C中的每个字符串后面都有一个空终止符,显示

当字符串结束时

现在,你正在从s1复制6个字母到s2,这是

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

所以s2并不像您希望的那样是“login:”

所以我建议使用

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");
将字符串与包含以下字符的“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")
c中的字符串库
包含两个函数
strcmp(s1,s2)
strcmpi(s1,s2)
strcmp
函数无法按长度比较字符串。 它比较字符串的第一个字符的ascii值,如果我提供
s1=“Login”
s2=“Sign out”
则返回负值,因为“L”的ascii值小于“S”的ascii值。
如果第一个字符与第二个字符相同,则检查第二个字符。

strcmp
用于精确匹配。我建议仔细阅读,看看是否有其他函数可以用于此任务…我正在将前6个字符(应该是“login:”)复制到另一个字符串中,该字符串将与字符串“login:”)进行比较,因此我将进行精确匹配。哦,这是一个公平的观点;我没有注意到。