#define MAX_COMMAND_LEN 32
char command[MAX_COMMAND_LEN];
while (1) {
if (fgets(command, MAX_COMMAND_LEN, stdin) == NULL) {
perror("Error: standard function fgets has failed\n");
break;
}
if (command[strlen(command) -1] != '\n') {
printf("Error: command length must be less than or equal to 30 characters\n");
continue;
}
else {
printf("Error: command not found\n");
}
}
quit();
我有几个我无法处理的问题:
command not found
消息。command not found
和command length must be less than or equal to 30 characters
条消息。我相信它将输入分为30个长度段并输入其中每个段,我该如何克服它?我试图刷新stdin
,它不起作用。我想摆脱其余的输入。我如何克服所有这些问题?
答案 0 :(得分:2)
对于你的第二个问题,这是因为fgets
获取31个(MAX_COMMAND_LEN
,减去空格以终止'\0'
个字符)的第一个字符,你注意到它没有换行符,下次是循环fgets
获取剩余的字符。
答案 1 :(得分:2)
当我输入一个大小超过30个字符的命令时,它会打印“未找到命令”和“命令长度必须小于或等于30个字符”的消息。
fgets
会在MAX_COMMAND_LEN - 1
留出空间时读取最多'\0'
个字符。
这就是为什么对于任何超过30个字符的消息,fgets
读取的前31个字符不包含'\n'
,因此显示30长度的消息。
由于命令的第二部分最后有'\n'
,因此也会打印command not found
。
对于此命令,当我输入64尺寸命令时,它会打印两次30长度的消息。
fgets
被调用3次。读取第一个31长度的块,然后读取第二个31长度的块,然后读取剩余的字符。两个31个长度的块都不包含'\n'
个字符,因此30个长度的消息会显示两次。
答案 2 :(得分:1)
您可能误解了fgets
works的实际情况:
char * fgets ( char * str, int num, FILE * stream );
从流中读取字符并将它们作为C字符串存储到str中 直到(num-1)个字符被读取或者是换行符或者 达到文件结尾,以先到者为准。换行符 使fgets停止阅读,但它被认为是一个有效的角色和 因此它包含在复制到str的字符串中。空 在读取字符后,字符会自动附加到str中 发信号通知C字符串的结尾。
所以,
fget
多次读取它时。 答案 3 :(得分:1)
对于问题(i),抱歉,我不知道为什么,因为我的程序提供了正确的输出。
对于问题(ii),你给fgets的第二个参数是32,该函数最多可读取32个字符,包括'\ n'和'\ 0';剩下的仍然是在stdin缓冲区中,当你的程序在打印错误后继续运行时,fgets将读取stdin缓冲区中的剩余字符,直到它读为'\ n'。
如果要刷新stdin,则需要fpurge(stdin)
函数来清除stdin缓冲区。