c - getchar() 和 printf() 内部到底发生了什么?解释一下整个过程

标签 c function return-value implementation conceptual

我正在向 geeksforgeeks学习 当我看到这个时,我的脑海中浮现出一个想法,因为 getchar() 和其他类似的函数返回一个 int (无论是由于程序失败还是 EOF),那么为什么使用格式说明符是%c,为什么不是%d(或%i)

// Example for getchar() in C
#include <stdio.h>
int main()
{
   printf("%c", getchar());
   return 0;
}

我知道我们输入的字符是一个字符,它由函数 getchar() 获取,我们使用 %c 显示它。

但我的问题是在整个过程中 getchar()printf() 内部实际发生了什么,其中 getchar() 返回该整数,它的存储位置以及我们输入的字符如何通过 printf() 来显示,即 printf() 内部发生了什么?

我对 printf() 实现进行了一些研究,并了解 printf 是 C 标准库(又名 libc)的一部分)并且是一个可变参数函数( printf ),但我不知道这个函数内部到底发生了什么以及它如何通过格式说明符知道它必须打印字符或整数?

请帮助我了解正在发生的整个详细过程。

最佳答案

getchar 的手册页内容如下:

fgetc() reads the next character from stream and returns it as an unsigned char cast to an int, or EOF on end of file or error.

getc() is equivalent to fgetc() except that it may be implemented as a macro which evaluates stream more than once.

getchar() is equivalent to getc(stdin).

假设您输入字符A。假设您的系统使用字符的 ASCII 表示形式,则该字符的 ASCII 值为 65。因此在本例中,getchar 返回 65 作为 int

然后将 getchar 返回的 int 值 65 传递给 printf 作为第二个参数。 printf 函数首先查看格式字符串并查看%c 格式说明符。 printf 的手册页对 %c 进行了如下说明:

If no l modifier is present, the int argument is converted to an unsigned char, and the resulting character is written.

因此,printf 将下一个参数读取为 int。由于我们传入了值为 65 的 int,因此它读取的内容就是这样。然后将该值转换为 unsigned char。由于该类型仍然很流行,因此该值仍然是 65。然后 printf 打印该值的字符。由于 65 是字符 A 的 ASCII 值,因此会出现字符 A

关于c - getchar() 和 printf() 内部到底发生了什么?解释一下整个过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44391457/

相关文章:

c - 如何比较无符号和有符号长变量?

java - 哪个文件会告诉我 doxygen 中的映射

function - C shell 如何将多个命令放在一个别名中?

java函数读取文件夹中的文件

Java调用方法并捕获返回

android - 异步任务 : where does the return value of doInBackground() go?

c++ - OSX 终端中的鼠标位置/控制

c++ - 数组遍历中的BST

javascript - var functionName = function() {} vs function functionName() {}

regex - Powershell以字符串模式显示的5位数字格式