我有一个问题,因为在我将输入粘贴到其中之后,我无法找到一种方法来停止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;
}
}
谢谢!
答案 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()
模拟该行为,因此需要用户执行某些操作。