strcmp不工作

strcmp不工作,c,strcmp,C,Strcmp,我知道这可能是一个全新的问题(我很久没有接触过C了),但是有人能告诉我为什么这不起作用吗 printf("Enter command: "); bzero(buffer,256); fgets(buffer,255,stdin); if (strcmp(buffer, "exit") == 0) return 0; 如果我输入“exit”,它不会输入If,它是否与“buffer”的长度有关 有什么建议吗?fgets()返回字符串“exit\n”--与gets()不同,它保留换行符。要

我知道这可能是一个全新的问题(我很久没有接触过C了),但是有人能告诉我为什么这不起作用吗

printf("Enter command: ");
bzero(buffer,256);
fgets(buffer,255,stdin);

if (strcmp(buffer, "exit") == 0)
    return 0;
如果我输入“exit”,它不会输入If,它是否与“buffer”的长度有关

有什么建议吗?

fgets()返回字符串“exit\n”--与gets()不同,它保留换行符。

要执行此操作:

strcmp(缓冲区,“退出”)

也就是说,当您输入字符串并按“回车”键时,换行符将成为
缓冲区的一部分


或者,使用strncmp(),它只比较字符串中的n个字符,与Dave一致。此外,您可能希望改用strncmp()。然后可以设置比较的长度


正如其他人所说,与
相比,“退出”
是失败的,因为
fgets()
在缓冲区中包含了换行符。它的保证之一是缓冲区将以换行结束,除非输入的行对于缓冲区来说太长,在这种情况下,它不会以换行结束
fgets()
还保证缓冲区以nul结尾,因此您不需要将256字节归零,只需让
fgets()
使用255即可获得该保证

与“exit\n”
进行精确比较的简单答案是,用户没有意外地在单词之前或之后添加空格。如果您想强制用户小心使用退出命令,这可能无关紧要,但通常可能会引起用户的不满

使用
strncmp()
可能会允许
退出“
退出42”
,以及更多您可能不需要的匹配。这可能会对您不利,尤其是当某些有效命令是其他有效命令的前缀字符串时


在一般情况下,最好将I/O、标记化、解析和操作分离到各自的阶段

我建议您从字符串的末尾\n删除,如下所示

char buf[256]; int len; /* get the string, being sure to leave room for a null byte */ if ( fgets(buf,sizeof(buf) - 1) == EOF ) { printf("error\n"); exit(1); } /* absolutely always null-terminate, the easy way */ buf[sizeof(buf) - 1] = '\0'; /* compute the length, and truncate the \n if any */ len = strlen(buf); while ( len > 0 && buf[len - 1] == '\n' ) { buf[len - 1] = '\0'; --len; } char-buf[256]; 内伦; /*获取字符串,确保为空字节留出空间*/ 如果(fgets(buf,sizeof(buf)-1)=EOF) { printf(“错误\n”); 出口(1); } /*绝对总是空终止,简单的方法*/ buf[sizeof(buf)-1]='\0'; /*计算长度,如果有,则截断\n*/ len=strlen(buf); 而(len>0&&buf[len-1]='\n') { buf[len-1]='\0'; --len; }
这样,如果必须将输入的字符串与几个常量进行比较,则不必将\n添加到所有常量。

。。。“get”只接受一个参数(本例中为缓冲区)。谢谢(请不要在公共场合使用gets()。@Jian,因为gets()不能防止缓冲区溢出。除非用户在退出之前或之后键入空格,否则这很好。别忘了厄瓜多尔加入时系统停止运行的(可能是虚构的)故事——人们必须键入首都基多的名字,程序退出(退出),因为只有前4个字母与“退出”相比较。真讨厌@乔纳森·特鲁斯!我个人的建议是确保用户永远不被允许在您的程序中输入任何内容;不要减去一(或使用255),因为fgets()行为正常-您告诉它有多少空间,它确保它不再使用,将空终止符放在数组中最后一个可用字符中。正是我想说的。。。但是说得更好为什么要投否决票?这是一个有效的解决方案,尽管没有解释。