strcmp无法正常工作

时间:2009-06-09 01:16:06

标签: c strcmp

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

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

if (strcmp(buffer, "exit") == 0)
    return 0;

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

有什么建议吗?

5 个答案:

答案 0 :(得分:20)

你想这样做:

strcmp(buffer, "exit\n")

也就是说,当您输入字符串并按“Enter”时,换行符将成为buffer的一部分。

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

的n个字符

答案 1 :(得分:9)

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

答案 2 :(得分:5)

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

与完全"exit\n"进行比较的简单答案要求用户不会在单词之前或之后意外添加空格。如果您想强制用户小心使用退出命令,这可能无关紧要,但可能会引起用户烦恼。

使用strncmp()可能会使"exited""exit42"等更匹配您可能不需要的地方。这可能会对您不利,特别是如果某些有效命令是其他有效命令的前缀字符串。

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

答案 3 :(得分:0)

同意Dave。您也可以使用strncmp()代替。然后你可以设置一个比较长度。

http://www.cplusplus.com/reference/clibrary/cstdio/fgets/

http://www.cplusplus.com/reference/clibrary/cstring/strncmp/

答案 4 :(得分:0)

我建议您从字符串的末尾剥离\ 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;
}

这样,如果你必须将输入的字符串与几个常量进行比较,你就不必将\ n添加到所有这些常量。