strcmp无法正常工作

jua*_*uan 7 c strcmp

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

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

if (strcmp(buffer, "exit") == 0)
    return 0;
Run Code Online (Sandbox Code Playgroud)

如果我输入"exit"它不会输入if,它是否与"buffer"的长度有关?

有什么建议?

pou*_*def 22

你想这样做:

strcmp(buffer, "exit\n")

也就是说,当您输入字符串并按"输入"时,换行符将成为其中的一部分buffer.

或者,使用strncmp(),它只比较字符串的n个字符

  • 除非用户在退出之前或之后键入空格,否则这很好.并且不要忘记在添加厄瓜多尔时系统停止工作的(可能是伪造的)故事 - 人们不得不输入Quito作为首都的名称,并且程序退出(退出),因为只有前4个字母被比较'放弃'.相当讨厌! (4认同)
  • @Jonathan的真相!我自己的建议是确保永远不允许用户在程序中输入任何内容. (3认同)

Dav*_*ave 9

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

  • (请不要在公共场合使用gets().) (8认同)
  • @Jian,因为gets()不能保护你免受缓冲区溢出的影响. (2认同)

RBe*_*eig 5

正如其他人所说,与"exit"失败相比,因为fgets()在缓冲区中包含换行符.它的一个保证是缓冲区将以换行符结束,除非输入的行对于缓冲区来说太长,在这种情况下它不会以换行符结束.fgets()还保证缓冲区是nul终止的,所以你不需要零256字节,但只允许fgets()使用255来获得保证.

比较完全"exit\n"要求用户不会在单词之前或之后意外添加空格的简单答案.如果你想强迫用户小心退出命令,这可能无关紧要,但一般来说可能是用户烦恼的根源.

使用strncmp()可能允许"exited","exit42"以及更多匹配您可能不想要它们的位置.这可能会对您不利,特别是如果某些有效命令是其他有效命令的前缀字符串.

在一般情况下,将I/O,标记化,解析和操作分离到各自的阶段通常是个好主意.