10

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

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

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

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

有什么建议么?

4

5 回答 5

28

你想这样做:

strcmp(buffer, "exit\n")

也就是说,当您输入字符串并按“回车”时,换行符将成为buffer.

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

于 2009-06-09T01:20:09.677 回答
9

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

于 2009-06-09T01:17:27.000 回答
6

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

与精确比较的简单答案"exit\n"要求用户不会在单词之前或之后意外添加空格。如果您想强制用户小心退出命令,这可能无关紧要,但通常可能是用户烦恼的根源。

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

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

于 2009-06-09T01:46:50.590 回答
1

同意戴夫。您也可能希望使用 strncmp() 代替。然后您可以设置比较的长度。

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

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

于 2009-06-09T01:20:53.387 回答
1

我建议您像这样从字符串末尾剥离 \n 。

字符缓冲区[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 添加到所有常量中。

于 2009-06-09T01:55:04.643 回答