108.递归整数四则运算
1074
2022-05-28
getchar()
头文件:#include
【功能】读取一个字符,并返回它的ASCII码值
如果用户在按回车键之前输入了不只一个字符,其他字符会保留在键盘缓冲区中,等待后续系统调用读取。也就是说,后续的系统调用不会等待用户按键,而是直接读取缓冲区中的字符,直到缓冲区的字符读取完毕后,才等待用户按键。
【参数】该函数没有参数。
【返回值】读取的字符的ASCII码
【函数原型】 #define getchar() getc(stdin)
说明:本质是无参宏定义,但由于长相酷似函数,所以我们可以把gatcahr()当成函数看
【代码实践】
getchar是输入字符的函数,括号内不能有参数
getchar('a'); //报错
如果将getchar()执行时写入整数会怎样?
系统会将整数认为是字符,如下例:输入了0,系统会将0认为是字符'0',输出字符'0'的%d为:48
char a; a = getchar(); //输入0 printf("%c,%d\n",a,a); //0,48
那只有0~9可以作为字符,如果输入个大于9的数呢?
系统会取第一个数字作为输入的字符,如下例:输入23,系统只识别2,不识别3,并将2作为字符'2'输出,输出字符'2'的%d为:50
char a; a = getchar(); //输入23 printf("%c,%d\n",a,a); //2,50
如果输入好多个字符呢?
系统只取第一个字符,剩下的字符不管。如下例:输入abc,系统只识别a,不识别bc,通过输出结果也可看出来,请自行体会。
char a; a = getchar(); //输入abc printf("%c,%d\n",a,a); //a,97
如果用户在按回车键之前输入了不只一个字符,其他字符会保留在键盘缓冲区中,等待后续系统调用读取。也就是说,后续的系统调用不会等待用户按键,而是直接读取缓冲区中的字符,直到缓冲区的字符读取完毕后,才等待用户按键。
这段话怎么理解呢?我们用代码来帮助理解。
下列代码是这样的:我们通过while循环从键盘中输入一个字符,如果读取到输入的字符不是'k',就输出它(需要按回车键),当输入'k'时停止循环。那什么是保留到键盘缓冲区呢?我们知道getchar是一次读取一个字符,需要按回车系统才会认为我们结束了本次输入,当我们不按回车时系统就不会认为我们输完了,在这个时候我们如果输入abcdeg,系统会只调用一次getchar()读取一个字符'a',并将'b'、'c'、'd'、'e'、'f'、'g'、'\n'依次放入到键盘缓冲区里,当我们按下回车,系统就会读取a并输出'a',然后不让我们输入了,转去调用getchar()读取缓冲区里的'b',再输出'b',然后再调用getchar()读取缓冲区里的'c',再输出'c',直到调用getchar()读取完并输出完本次'a'、'b'、'c'、'd'、'e'、'f'、'g'、'\n'所有字符为止。输出完后,由于并没有碰到'k',所以系统会让我们继续输入,我们输入:hijklmn,按下回车,系统会依次调用getchar()读取'h',输出'h';调用getchar()读取'i',输出'i';调用getchar()读取'j',输出'j';调用getchar()读取'k',此时系统发现输入的字符等于'k',不满足循环条件了,便会退出while循环而且不会输出'k'。为什么会退出循环?是因为我们程序就是这样设计的。因此这一次系统输出的是:hij。当我们按下任意按键时,程序会退出。
#include
由于上段代码中printf("%c",c);输出的是一个字符,因此我们可以用putchar(c)替换掉它,效果与其一模一样
#include
【运行结果】
abcdefg //输入:abcdefg 回车 abcdefg //依次从键盘缓存区中读取abcdefg和\n,并依次输出:abcdefg和\n hijklmn //输入:hijklmn 回车 hij //依次从键盘缓存区读取hij,并依次输出;读取到k时退出循环 -------------------------------- Process exited after 6.641 seconds with return value 107 请按任意键继续. . .
如果条件改为:
while( (c=getchar()) != '\a' )
那么'\a'是控制字符 - 响铃,由于键盘上没有这个键,所以我们无论输入多少字符都不会结束程序的运行(除非手动点右上角的
×退出)。
冷知识:
可以这样用吗?
while( (printf("%c",getchar())) != '\n' ) ;
可以的,while里可以调用函数,此语句的意思是输入字符并输出,当读取的字符不是\n时就一直循环,当读取到'\n'时结束循环。但是由于我们不知道printf的返回值,所以暂时不要这样用(printf的返回值暂时无需研究)
while( putchar(getchar()) );
可以的,不过同样不知道putchar的返回值什么时候是0,所以成了死循环,不断输入字符、按下回车、调用getchar()读取字符、调用putchar()输出字符。
putchar()
头文件:#include
函数与形参类型: int putchar(int ch)
功能:输出一个字符,可以是字符常量或字符变量
返回值:字符的ASCLL码
1.输出字符常量:
可以输入整型或字符型,系统会将65、 0101 、0x41这三个不同进制的ASCII码会转化为字符型常量'A'。
putchar('A'); //A putchar(65); //A putchar(0101); //A putchar(0x41); //A
2.输出字符变量:
char ch = 'A'; putchar(ch); //A int a = 65 ,b = 0101 , c = 0x41; putchar(a); //A putchar(b); //A putchar(c); //A
putchar()与getchar()混合使用:
为什么可以这样用?因为getchar的返回值是输入字符的ASCII码值。
putchar()基本形式:输入8,调用getchar()读取'8',输出'8'
int c = getchar(); //8 putchar(c); //8
上述写法等价于下面写法
这种写法省去了定义c变量,可以直接输入并输出一个字符
putchar(getchar()); //1 printf("%c",getchar()); //2 与1等价
函数的实参可以是函数?这叫函数的嵌套调用吗
输入字符,键盘调用getchar()读取一个字符,调用了4次,然后调用putchar()输出1个字符,调用4次。
#include
【运行结果】
abcdefg //输入 abcd //输出
上述代码等价于下面的代码
#include
【运行结果】
123456789 //输入 1234 //输出
实例:
依次输入两个字符的值:5和6并换行输出他俩
#include
【运行结果】
注意:这里的输入和输出,都是数字字符,本质是字符!!!
请输入元素a的值:5 请输入元素b的值:6 5 6
假设1:
如果在getchar输入完a以后,不吸收回车,那么系统在输出a之后,将不会让我们输入b,而是把回车 即'\n'赋值为b,再输出b
#include
请输入元素a的值:5 //输入a:5 请输入元素b的值:5 //系统将回车赋给b,再输出a,(本行的5并不是我输入的) //执行putchar('\n') 换行 //输出b (此时的b是'\n') b元素的ASCII码是:10 //执行putchar('\n') 换行,再输出b的ASCII码:10(对应'\n')
假设2:
如果将两条putchar换行语句的单引号变为双引号,就不是换行语句了,因为putchar只能输出字符
putchar("\n"); //变为双引号就不可以换行了
请输入元素a的值:5 请输入元素b的值:6 5$6$
控制台
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。