大家好,我是一只励志要翻身的小牛🐮,今天我们刨根问底,探究getchar()与putchar()的那点事!
一、详解字符输入函数getchar()
1、函数getchar()原型
目前我们要做的是从宏观上考察函数getchar()的特点,就像你认识一个陌生人时,在对它进行深入了解之前,先看看它的外貌和举止一样。下面我们对getchar()函数给出如下描述:👇
特征:函数getchar()的返回值为int类型
函数getchar()的参数为空
功能:它的作用是从stdin流中读入一个字符
注意:函数getchar()没有参数,函数的返回值就是从终端键盘读入的字符。其实这里就暗示了函数getchar()的参数是stdin——标准输入(这里指键盘输入)
问:既然返回值是读入的字符,为什么是int类型?
答:在C语言中,字符在存储的时候实际上是以ASCII码值进行存储的,每个字符都有对应的ASCII码值。所以既可以用char接受返回值,也可以用int接受返回值。
2、函数getchar()的输入原理
(1)函数getchar()采用行缓冲输入方式,即输入的字符先被放到输入缓冲区中,getchar()每次从输入缓冲区中读取一个字符,直到遇到回车键(回车键 \n 也一同被放到输入缓冲区)或者文件结束标志EOF时程序才认为输入结束。也就是说如果stdin有数据的话不用输入它就可以直接读取了,第一次调用getchar()时,确实需要人工的输入,但是如果你输了多个字符,以后的getchar()再执行时就会直接从缓冲区中读取了。
(2)也就是说,用getchar()读取字符实际上是按照文件的方式读取的,文件中一般都是以行为单位的,因此getchar()也是以行为单位读取的,这就是为什么getchar()结束输入或退出时要读到一个换行符或文件结束符EOF(vs编译器中EOF为Ctrl+z)
3、实践出真知
观察如下代码,分析输入打印过程:👇
//分别打印a、b、c、d #include<stdio.h> int main() { int count = 0; int ch = 0; while((ch=getchar())!=EOF) { count++; printf("第%d次打印%c\n",count,ch); } return 0; }
详解:从输出结果可以看出,我们从头到尾只输入了一次:abcd 当我们回车,键入数据后,每循环一次屏幕上打印一行数据,当打印完a、b、c、d四行数据后,由于输入缓冲区中还剩一回车(\n)所以第五次循环打印回车(\n),此时因为未遇到结束符EOF所以屏幕光标继续闪烁等待输入,此时在VS编译器下键入Ctrl+z使循环停止。如图:
注意:在一般情况下,getchar()的返回值是终端所输入的字符,这些字符在系统中对应的ASCII码值通常都是非负的。但有时getchar()也可能返回负值即EOF(大多数编译器下EOF为-1)这时将getchar()的返回值赋给char型变量是不合适的,因此为了让定义的变量包含getchar()返回的所有可能值,我们通常将其返回值赋给int类型变量。
二、详解字符输出函数putchar()
1、函数putchar()原型
特征:函数putchar()的返回值为int类型
函数putchar()的参数为 character-- 这是要被写入的字符。该字符以其对应的 int 值进行传递。
功能:把参数 char 指定的字符(一个无符号字符)写入到标准输出 stdout 中
2、函数putchar()的输出方式
putchar函数的基本格式为:putchar(c),通常与getchar()结合使用:
(1)当c为一个被单引号(英文状态下)引起来的字符时,输出该字符(注:该字符也可为转义字符);
(2)当c为一个介于0~127(包括0及127)之间的十进制整型数时,它会被视为对应字符的ASCII代码,输出该ASCII代码对应的字符;
(3)当c为一个事先用char定义好的字符型变量时,输出该变量所指向的字符。
注意:函数putchar()一次传递一个参数,输出一个字符
3、实践出真知
1、输出ABC
#include<stdio.h> int main() { putchar('A'); putchar(66); char ch = 'C'; putchar(ch); return 0; } //输出:ABC
2、使用getchar()、putchar()实现输入A,打印A
#include<stdio.h> int main() { int ch = getchar(); putchar(ch); return 0; } //输入:A //打印:A
三、结语
好啦,今天的全部内容就到这里了,如果本文对你有所帮助的话,请给博主一个一键三连哦,您的支持就是我写作的动力🥰铁汁们保持Coding,我们下期再见!