fgets()总是在等待输入,无法找到解决方法

时间:2017-10-15 04:28:38

标签: c

我有一个问题,因为在我将输入粘贴到其中之后,我无法找到一种方法来停止fgets()从stdin读取。我想让它读取我粘贴的内容并在之后停止(它可以是不同的长度)。现在它正在等待另一个输入。

void readMatrix(char (*charM)[40]) {
    char charT[42] = {0};
    int count = 0;

    while (fgets(charT, 42, stdin) != NULL) {
        for (int i = 0; i < 40; i++){
            if (charT[i] == 0 || charT[0] == '\n' ) {
                printf("Erreur: Caractère `EOF` inattendu, attendu `H`, `X` 
ou `.`."); 
                exit(0);
            }
            if(charT[i] != '.' && charT[i] != 'H' && charT[i] != 'X') {
                printf("Erreur: Caractère `%c` inattendu, attendu `H`, `X` 
ou `.`.", charT[i]);
                exit(0);
            }
            charM[count][i] = charT[i];
        }
        count++;
        if (count == 20) break;
    }
}

谢谢!

2 个答案:

答案 0 :(得分:3)

while (fgets(charT, 42, stdin) != NULL)

即使您没有键入任何内容并且按Enter键,它也会在C中提供以null结尾的字符串。您需要更改此条件,或者您需要为标准输入提供传输结束字符。 For Linux it is Ctrl + D, for Windows it is Ctrl + Z.

答案 1 :(得分:1)

复制和粘贴时,没有任何复制可以结束输入。

由于没有任何内容复制,因此输入fgets()不会返回NULL

执行复制和粘贴后,可能会有最后一行输入等待读取。在这种情况下,必须按Enter键,因此fgets()将返回最后一行输入。如果你很幸运,那个步骤是没有必要的(因为回车已被复制为最后一个字符),但仍然没有告诉fgets()输入已经结束。

所有内容都被复制的事实并没有告诉fgets()输入已经结束。重要的是,如果您愿意,您可以根据需要多次将文本复制到您的程序中。

要实际发出对程序输入结束的信号,您需要手动执行某些操作来指示该程序。对于大多数unix版本,使用CTRL-D完成。对于Windows,它是CTRL-Z。根据程序的运行方式(例如在终端窗口中),可能需要手动执行两次(例如,在Windows下按两次CTRL-Z)。

请注意,在输入信号结束前至少按一次回车键是个好主意。如果有一条不完整的行等待读取(即还没有换行),某些键盘或终端驱动程序将在遇到输入结束时丢弃最后一行。例如,在Windows下,总是按CTRL-Z(并且可能还需要再次输入CTRL-Z)。

注意:某些程序可以合理地处理复制和粘贴。但是这些程序使用fgets()的系统相关函数INSTEAD,因此它们可以识别复制/粘贴文本的结尾。您无法使用fgets()模拟该行为,因此需要用户执行某些操作。