我知道这可能是一个全新的问题(我很长一段时间没有接触过C),但有人可以告诉我为什么这不起作用吗?
printf("Enter command: ");
bzero(buffer,256);
fgets(buffer,255,stdin);
if (strcmp(buffer, "exit") == 0)
return 0;
如果我输入“exit”,它不会输入if,是否与“buffer”的长度有关?
有什么建议吗?
答案 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添加到所有这些常量。