【发布时间】:2015-03-13 22:37:34
【问题描述】:
我用 getchar() 和 putchar() 和 '\n' 和 EOF(在 Visual Studio 中)测试了很多情况,以更好地了解缓冲和 getchar 的工作原理。
如果我的代码
int c;
printf("Enter character\n");
/* 1 - number for explaining steps */
c = getchar();
putchar(c);
/* 2 */
c = getchar();
putchar(c);
printf("hi");
在这段代码中,如果我输入字符 a 并按 Enter,它将显示
a
hi
这意味着当我按下输入时,'\n' 也将保存在缓冲区中,然后缓冲区中的第一项(a)转到第一个c=getchar() 并打印a;然后缓冲区中的第二项 (\n) 转到第二项
c=getchar() 并打印新行。
我的结论是 '\n' 保存在缓冲区中,这不是命令在按 Enter 时能够转到新行的结果,因为我为此测试了另一个代码:
while ((c = getchar()) != '\n')
putchar(c);
printf("hi");
在这段代码中,当我输入a 并按回车键时,它会打印ahi,而新行不打印,这意味着当a 传递给getchar() 时,putchar() 会打印它然后当getchar()获取'\n',循环终止,循环内的putchar() 不打印新行,因此该命令不是新行的原因。
现在我想测试另一个代码:
int c;
while ((c = getchar()) != EOF)
putchar(c);
printf("hi");
return 0;
如果我通过它abc 和 EOF 的信号(在我的系统中 ^Z (Ctrl+Z)),它将显示abc->。如果我们像前面的代码一样看它:
abc-1(or every thing else shows eof)'\n' 应该已保存在缓冲区中,首先 a 转到第一个 getchar (第一次循环有效) b 传递给第二个 getchar 然后 c 传递到第三个 - 然后 -1应该有已传递给c=getchar()
它违反了条件,循环应该终止。
但是,它会打印 -> 并继续循环,并且不会打印新行(缓冲区中的最后一项)。
相反,当我只是ctr +z 当c=getchar() 从缓冲区读取EOF 符号时,循环终止并打印了新行,那么为什么它打印新行?
它读取 EOF,它不应该读取缓冲区中的任何其他内容
在这种情况下。
【问题讨论】:
-
最后一段几乎完全是一个句子/问题;可以重新格式化一下吗?
-
在以后的问题中,以及一般地传递代码,您可以将步骤#1 之类的内容放在代码 cmets 中。当您谈论第 1 步时,程序员会知道查看 cmets,它可以防止我们的内部 C 编译器在我们阅读您的代码时发出嘶嘶声。
-
最后一个例子,c处理完后,下一个字符是'-'而不是'-1'。您确定 '>" 不是您在终端中的提示符吗?
-
请注意,第一个循环示例仅测试换行符,如果您在按 Enter 之前键入两次 Control-Z 将会遇到问题。对于出现的
->,我没有很好的解释。这可能是终端驱动程序所做的事情,尽管这不太可能。我没有运行测试的 Windows 系统。