输入/输出问题

时间:2012-06-12 07:19:04

标签: c input flush

#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();

我有几个我无法处理的问题:

  1. 当我按 Enter 时,它会停止循环并且不会打印command not found消息。
  2. 当我输入大小超过30个字符的命令时,会同时打印command not foundcommand length must be less than or equal to 30 characters条消息。
  3. 当我输入64尺寸命令时,它会打印两次30长度的消息。
  4. 我相信它将输入分为30个长度段并输入其中每个段,我该如何克服它?我试图刷新stdin,它不起作用。我想摆脱其余的输入。我如何克服所有这些问题?

4 个答案:

答案 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字符串的结尾。

所以,

  1. 当您按“Enter”时 - 它输入换行符,这不是代码中的例外情况。
  2. 当您输入大于30个字符的字符串fget多次读取它时。
  3. 与60个字符相同 - 换行符不是字符串的最后一个字符,因此会出现两次错误。

答案 3 :(得分:1)

对于问题(i),抱歉,我不知道为什么,因为我的程序提供了正确的输出。

对于问题(ii),你给fgets的第二个参数是32,该函数最多可读取32个字符,包括'\ n'和'\ 0';剩下的仍然是在stdin缓冲区中,当你的程序在打印错误后继续运行时,fgets将读取stdin缓冲区中的剩余字符,直到它读为'\ n'。

如果要刷新stdin,则需要fpurge(stdin)函数来清除stdin缓冲区。