我知道这可能是一个非常新手的问题(我已经很久没有接触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()
还保证缓冲区以空字符结尾,因此您不需要清零256个字节,只需让fgets()
使用255个字节即可获得该保证。"exit\n"
的简单答案要求用户不会在单词前后意外添加空格。如果您想强制用户小心使用退出命令,则可能无关紧要,但总体上可能会成为用户烦恼的原因。strncmp()
可能会使"exited"
、"exit42"
等匹配,这可能会对您产生负面影响,特别是如果某些有效命令是其他有效命令的前缀字符串时。http://www.cplusplus.com/reference/clibrary/cstdio/fgets/
http://www.cplusplus.com/reference/clibrary/cstring/strncmp/
我建议您从字符串末尾删除 \n,像这样。
char buf[256]; int len; /* 获取字符串,确保留有空间用于空字节 */ if ( fgets(buf,sizeof(buf) - 1) == EOF ) { printf("错误\n"); exit(1); } /* 绝对始终以空字符结尾,简单易行 */ buf[sizeof(buf) - 1] = '\0'; /* 计算长度,并截断任何 \n */ len = strlen(buf); while ( len > 0 && buf[len - 1] == '\n' ) { buf[len - 1] = '\0'; --len; }
这样,如果您必须将输入的字符串与多个常量进行比较,则不必将 \n 添加到所有常量中。