函数解剖——深挖getchar()与putchar()

简介: 函数解剖——深挖getchar()与putchar()

995d59282b7d46ceac1f5fd8b4f3deda.png

大家好,我是一只励志要翻身的小牛🐮,今天我们刨根问底,探究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

1ebf8bc48da8402e98bc434dd2730b79.png

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,我们下期再见!


相关文章
|
1月前
|
算法 Java C语言
算法编程(一):实现 strStr()
算法编程(一):实现 strStr()
36 0
|
21天前
|
Windows
函数解剖——深挖printf()与scanf()
函数解剖——深挖printf()与scanf()
函数解剖——深挖printf()与scanf()
|
28天前
|
C语言
C语言进阶21收尾(编程练习)(atoi,strncpy,strncat,offsetof模拟实现+找单身狗+宏交换二进制奇偶位)(上)
C语言进阶21收尾(编程练习)(atoi,strncpy,strncat,offsetof模拟实现+找单身狗+宏交换二进制奇偶位)
58 0
|
28天前
|
C语言
C语言进阶21收尾(编程练习)(atoi,strncpy,strncat,offsetof模拟实现+找单身狗+宏交换二进制奇偶位)(下)
C语言进阶21收尾(编程练习)(atoi,strncpy,strncat,offsetof模拟实现+找单身狗+宏交换二进制奇偶位)
23 0
|
27天前
|
存储 编译器 C语言
C语言程序设计——字符输入函数getchar()
C语言程序设计——字符输入函数getchar()
|
1月前
|
存储 C语言
爱上C语言:scanf、gets以及getchar输入字符串你真的懂了吗
爱上C语言:scanf、gets以及getchar输入字符串你真的懂了吗
|
6月前
|
程序员 编译器 C++
C生万物 | 模拟实现库函数strcpy之梅开n度
C生万物 | 模拟实现库函数strcpy之梅开n度
31 0
|
7月前
|
编译器 C语言
【C语言航路外传】输入输出函数及输入缓冲区的那点事
【C语言航路外传】输入输出函数及输入缓冲区的那点事
31 0
|
10月前
|
数据安全/隐私保护 C语言
【C语言】getchar和putchar函数详解:字符输入输出的利器
【C语言】getchar和putchar函数详解:字符输入输出的利器
288 0
|
11月前
|
安全 数据安全/隐私保护 C语言
【C语言】scanf getchar gets函数详解,带你摆脱窘境
【C语言】scanf getchar gets函数详解,带你摆脱窘境
90 0