关于C (K&R) 中getchar 和putchar 的问题
Questions regarding getchar and putchar in C (K&R)
所以我正在按照 Dennis Ritchie 和 Brian Kernighan 的书 'The C Programming Language 2nd Edition' 学习 C。在1.5.1 File Copying
节中,显示以下程序:
#include <stdio.h>
/* copy input to output; 1st version */
main()
{
int c;
c = getchar()
while (c != EOF) {
putchar(c);
c = getchar();
}
}
我在这里有几个问题。
- 为什么变量
c
声明为 int
?因为它是一个 getchar()
函数,它不应该是 char
类型吗?
putchar
和printf
有什么区别?
- 我不明白
while
循环条件中提到的 EOF
是什么
谢谢!
char
只是一个 7 位数。计算机使用计算机使用的任何字符编码(主要是 ASCII)将这些数字编码为字符。大多数 C 库函数甚至使用 int
来做一些与处理字符相关的事情。在这种情况下,getchar()
returns 和 int
,因此在这种情况下使用 int
是有意的。
putchar()
只是根据输入值打印一个字符,而 printf()
可以做任何你喜欢的事情。
EOF
(“文件结束”)字符在没有更多输入时收到。while (c != EOF)
如果我们收到 EOF
将退出循环
- Why is the variable
c
declared as an int
? Because it's a getchar()
function shouldn't it be of type char
?
getchar
不能 return 只是 char
因为它需要 return 一个字符(如果操作成功)或 EOF
(如果操作成功失败)。
因此 getchar
return 是 int
。如果操作成功读取一个字符,它 return 将该字符作为 unsigned char
值。 (这是字符操作应该更喜欢使用 unsigned char
类型的原因之一。避免使用 char
。)如果操作没有读取字符,要么是因为输入中没有更多字符流或因为发生错误,则 getchar
returns EOF
。 EOF
有一些负值,所以它总是不同于 unsigned char
值。
如果将 getchar
的结果分配给 char
,int
值将转换为 char
。在典型的 C 实现中,getchar
有 257 个可能的 return 值—256 个字符值和一个 EOF
值,但 char
只有 256 个可能的值。因此,转换会将至少两个不同的值映射到同一事物,通常是 EOF
和其他一些字符。那么就不可能将这两件事与 char
值区分开来。您需要使用 int
来保留原始 getchar
return 值。
- What is the difference between
putchar
and printf
?
putchar
将单个字符发送到标准输出流。
printf
执行格式化操作并将结果发送到标准输出流。即使在最简单的情况下 printf
只给出了一个没有要转换的参数的格式字符串,它仍然是一个字符串,而不是单个字符。
- I don't get what is the
EOF
mentioned in the condition of the while
loop
EOF
代表“文件结尾”,但如果到达流的末尾或发生错误,则 return by getchar
。
所以我正在按照 Dennis Ritchie 和 Brian Kernighan 的书 'The C Programming Language 2nd Edition' 学习 C。在1.5.1 File Copying
节中,显示以下程序:
#include <stdio.h>
/* copy input to output; 1st version */
main()
{
int c;
c = getchar()
while (c != EOF) {
putchar(c);
c = getchar();
}
}
我在这里有几个问题。
- 为什么变量
c
声明为int
?因为它是一个getchar()
函数,它不应该是char
类型吗? putchar
和printf
有什么区别?- 我不明白
while
循环条件中提到的EOF
是什么
谢谢!
char
只是一个 7 位数。计算机使用计算机使用的任何字符编码(主要是 ASCII)将这些数字编码为字符。大多数 C 库函数甚至使用int
来做一些与处理字符相关的事情。在这种情况下,getchar()
returns 和int
,因此在这种情况下使用int
是有意的。putchar()
只是根据输入值打印一个字符,而printf()
可以做任何你喜欢的事情。EOF
(“文件结束”)字符在没有更多输入时收到。while (c != EOF)
如果我们收到EOF
将退出循环
- Why is the variable
c
declared as anint
? Because it's agetchar()
function shouldn't it be of typechar
?
getchar
不能 return 只是 char
因为它需要 return 一个字符(如果操作成功)或 EOF
(如果操作成功失败)。
因此 getchar
return 是 int
。如果操作成功读取一个字符,它 return 将该字符作为 unsigned char
值。 (这是字符操作应该更喜欢使用 unsigned char
类型的原因之一。避免使用 char
。)如果操作没有读取字符,要么是因为输入中没有更多字符流或因为发生错误,则 getchar
returns EOF
。 EOF
有一些负值,所以它总是不同于 unsigned char
值。
如果将 getchar
的结果分配给 char
,int
值将转换为 char
。在典型的 C 实现中,getchar
有 257 个可能的 return 值—256 个字符值和一个 EOF
值,但 char
只有 256 个可能的值。因此,转换会将至少两个不同的值映射到同一事物,通常是 EOF
和其他一些字符。那么就不可能将这两件事与 char
值区分开来。您需要使用 int
来保留原始 getchar
return 值。
- What is the difference between
putchar
andprintf
?
putchar
将单个字符发送到标准输出流。
printf
执行格式化操作并将结果发送到标准输出流。即使在最简单的情况下 printf
只给出了一个没有要转换的参数的格式字符串,它仍然是一个字符串,而不是单个字符。
- I don't get what is the
EOF
mentioned in the condition of thewhile
loop
EOF
代表“文件结尾”,但如果到达流的末尾或发生错误,则 return by getchar
。