我知道这之前已经讨论过了,但我想确保我正确地理解了这个程序中发生了什么,以及为什么。在丹尼斯·里奇的课本“C编程语言”的第20页上,我们看到了这个程序:
#include <stdio.h>
int main()
{
int c;
c = getchar();
while(c != EOF){
putchar(c);
c = getchar();
}
return 0;
}
在执行时,程序读取每个键入的字符,并在用户按enter键后以相同的顺序打印出来。除非用户手动退出控制台,否则此过程将无限期重复。事件的顺序如下:
getchar()
函数读取键入的第一个字符并将其值赋给c
.c
是整数类型,getchar()
传递给c的字符值被提升为相应的ASCII值。c
已初始化为某个整数值,while循环可以测试该值是否等于文件结束字符。由于EOF
字符的宏值为-1
,并且可以键入的字符都没有负的十进制ASCII值,因此while循环的条件将始终为true。c != EOF
为true,就会调用putchar()
函数,该函数会输出c
中包含的字符值。while getchar()
,因此它读取下一个输入字符,并将其值传递回while循环的开头。如果用户在执行之前只键入了一个字符,那么程序将读取<return>
值作为下一个字符,并打印一个新行,等待下一个输入被键入。这些都是完全正确的吗?
发布于 2018-09-11 08:04:13
是的,你基本上已经掌握了。但它更简单:getchar
和putchar
已经分别返回和接受int
类型。所以不会发生类型提升。您只是接收字符,然后循环发送它们,直到您看到EOF
。
您对为什么这些应该是int
而不是某种char
形式的直觉可能是正确的:int
类型允许在任何可能的字符值的值范围之外的定点EOF
值。
(在这一点上,K&R stdio
函数非常老,他们不知道Unicode和etc,而且一些基本的设计原理即使不是模糊的,也是不相关的。现在没有多少实用的代码会使用这些函数。这本书在很多方面都很优秀,但代码示例相当陈旧。)
(另外,顺便说一下,你的问题标题指的是“复制文件”,你仍然可以这样做,但还有更规范的方法)
https://stackoverflow.com/questions/52266912
复制相似问题