我知道这可能是一个完全新手的问题(我很长时间没有接触过 C),但是有人可以告诉我为什么这不起作用吗?
printf("Enter command: ");
bzero(buffer,256);
fgets(buffer,255,stdin);
if (strcmp(buffer, "exit") == 0)
return 0;
如果我输入“exit”它不会进入if,它是否与“buffer”的长度有关?
有什么建议么?
你想这样做:
strcmp(buffer, "exit\n")
也就是说,当您输入字符串并按“回车”时,换行符将成为buffer
.
或者,使用 strncmp(),它只比较字符串的 n 个字符
fgets() 返回字符串“exit\n”——与gets() 不同,它保留换行符。
正如其他人所说,比较"exit"
失败是因为fgets()
在缓冲区中包含换行符。它的保证之一是缓冲区将以换行符结尾,除非输入的行对于缓冲区来说太长,在这种情况下它不会以换行符结尾。fgets()
还保证缓冲区是 nul 终止的,因此您不需要将 256 字节归零,而只需fgets()
使用 255 即可获得该保证。
与精确比较的简单答案"exit\n"
要求用户不会在单词之前或之后意外添加空格。如果您想强制用户小心退出命令,这可能无关紧要,但通常可能是用户烦恼的根源。
使用strncmp()
可能允许"exited"
,"exit42"
和更多匹配您可能不想要的位置。这可能对您不利,特别是如果某些有效命令是其他有效命令的前缀字符串。
在一般情况下,将 I/O、标记化、解析和操作分成各自的阶段通常是一个好主意。
同意戴夫。您也可能希望使用 strncmp() 代替。然后您可以设置比较的长度。
http://www.cplusplus.com/reference/clibrary/cstdio/fgets/
http://www.cplusplus.com/reference/clibrary/cstring/strncmp/
我建议您像这样从字符串末尾剥离 \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 添加到所有常量中。