了解putchar()函数
先来了解一下putchar()函数。putchar()函数是一个输出单个字符的函数,它的原型如下:
int putchar(int c);
在标准C库(也称为libc)的stdio.h
头文件中可以找到这个函数。当调用putchar()函数时,它将把ASCII码为stdout
中。
如何将长整型数打印出来呢?通过putchar()函数处理这个问题,实际上是先将整型数转换成字符类型,即将数字0的ASCII码为48的字符打印,数字1的ASCII码为49的字符打印,以此类推。
使用putchar()函数打印长整型数的步骤
下面是使用putchar()函数打印长整型数的步骤:
将长整型数转换成字符类型
将每一位字符一个一个地打印
将长整型数转换成字符类型
先来看一下如何将长整型数转换成字符类型。最直接的想法是使用C语言中的类型转换符号——(char)
。具体来说,我们可以使用下述代码:
long num = 123456;
char c = (char) num;
这种方式可以将num所存储的长整型数转换成字符类型并将结果存储到字符变量c中。但这种方法只能够获取整型数的最后8bit(1个字节)所代表的字符。
那么我们要怎么样才能够遍历整个长整型数并将它转换成字符呢?可以先将长整型数除以10并保存商和余数,余数对应的ASCII码字符存入字符数组中。然后将商用于下一轮的运算,重复上述过程,直到初始数被完全摊销。
void print(long num) {
char buf[16] = {0};
int i = 0;
if (num == 0) {
putchar('0');
return;
}
while (num > 0) {
buf[i++] = (char) (num % 10 + '0');
num /= 10;
}
for (int j = i - 1; j >= 0; j--) {
putchar(buf[j]);
}
}
关于代码中的细节问题和对每一行代码的解释,将在下面的分析中详细说明。
putchar()函数打印长整型数的代码详解
将长整型数转换成字符类型
为了将整个长整型数都转换成字符类型,需要用到两个算法。首先是获取数字个数的算法,它可以通过不断地将数字除以10来得到。当商为0时,表示数字已经取完。代码如下:
while (num > 0) {
buf[i++] = (char) (num % 10 + '0');
num /= 10;
}
解析:
buf[i++]
表示将每个数字对应的字符放入字符数组buf中,并且将下标i加1,以便保存下一个数的字符。
num % 10
表示求余数,即取出最低位的数。例如1234%10=4。
'0'
是字符类型数字0的ASCII码值。这个值和目标数字的余数相加,就是当前位数字对应的ASCII码值。
num /= 10
表示整个长整型数每次都要缩小10倍,以便获得下一次循环中要处理的数字。
当这个while循环结束后,整个长整型数都被分解到字符数组buf中了,数字的顺序是反转的。因此需要进行翻转操作,将数字反转回来再逐个字符打印。
将每一位字符一个一个地打印
在得到这个字符数组buf之后,只需要将它打印出来:
for (int j = i - 1; j >= 0; j--) {
putchar(buf[j]);
}
解析:
i
是数字个数。因为在前面的 while 循环中已经将所有数字转换成字符并保存在buf中。因此将下标i-1作为最后一个字符的下标,从后往前依次打印所有字符。
buf[j]
表示从字符数组buf中取出下标为j的字符,并将它送入到标准输出中。
完整代码
#include <stdio.h>
void print(long num) {
char buf[16] = {0};
int i = 0;
if (num == 0) {
putchar('0');
return;
}
while (num > 0) {
buf[i++] = (char) (num % 10 + '0');
num /= 10;
}
for (int j = i - 1; j >= 0; j--) {
putchar(buf[j]);
}
}
int main() {
long a = 1234567890;
print(a);
return 0;
}
这个程序首先声明了一个名为print
的函数,该函数将一个长整型数转换成字符并逐个打印出来。接着在main()
中使用了print()
函数将长整型数1234567890转换成字符并输出到标准输出中。
这个程序仅用于演示这个函数的作用及实现方法。实际编程过程中可能需要增加注释、错误处理,甚至进行更多的测试和优化。
总结
putchar()函数是一个十分重要的单字符输出函数,它的使用范围十分广泛。使用putchar()函数打印长整型数的实现过程正式基于将数字转换成字符类型的想法。整个过程需要两个算法:一个用于获取到每一位数字,一个用于将获取到的每一位数字转换成字符类型,然后逐个字符打印出来。在实践中,还需要注意代码的注释、错误处理、性能优化等问题。