1.定义
花一点时间认真阅读,这篇文章应该会让您多理解一点东西。
1.getchar
getchar函数是字符输入函数,其功能是从键盘上获取一个输入字符。
读取方式:
从stdio(输入)流中读字符,相当于getc(stdin),它从标准输入(键盘)里读取下一个字符。,返回值为用户输入的ASCⅡ码,出错返回-1,用户输入的字符被存放在键盘缓冲区中.直到输入回车键才从缓冲区依次提取字符,当用户键入回车之后,getchar会从输入流中读取第一个字符,
注意:
1.getchar只能输入一个字符。如果你输入多个字符,它只接受第一个字符。
_2._如果输入流缓冲区中没有数据,那么getchar就会处于等待状态,从而使程序窗口停留。这也是为什么getchar可以作为暂停函数的原因,
2.scanf
scanf()函数是格式输入函数,即按用户指定的格式从标准输入设备(键盘) 上把数据输入到指定地址的变量中。
读取方式:
一般格式为:scanf(格式控制,地址列表) 也就是scanf(“%?”,&?); 可以读取相对于类型的数值并且存储到制定变量,并且可以读取多个数值,如数字,字符,字符串等
注意:
scanf()在读取数字时会跳过空格、制表符和换行符!
两者区别:
1.scanf返回成功赋值项个数,并将数值赋值到指定参数上,而getchar只读取一个字符并返回其ascii码,并且可以赋值也可以不赋值。
1 | scanf("%d",&a); |
2.结束输入的方式不同
scanf遇到 回车(enter),空格,TAB 就会结束一次输入,空格不会接收
getchar函数只以回车Enter结束输入,接受空格符。
3.
scanf在一次输入结束后,不会舍弃最后的回车符(即回车符会残留在缓冲区中)
getchar回车作为结束的标志,所以在敲回车时’\n’也被存入缓存
看下面的程序:
1 | #include <stdio.h>int main(){ char c1,c2; scanf("%c %c",&c1,&c2); //这里有一个空格 |
第一次输入a和b正常,没有问题,但是第二次就出现问题了,
scanf单字符输入时规定只接收一个字符,所以第一次输入a b 时 ,第一个scanf(“%c %c”)之间有一个空格,所以在输入字符a之后,我们可以输入空格,enter,,scanf都会自动忽略它(那个空格会读取停止字符并释放掉),所以第一次输入正常,但它却把回车符也作为字符对待的。在我们输入完b之后按回车(Enter),这个回车符是放在缓冲区的,并且不会舍弃最后的回车符
第二次调用scanf(“%c%c”,&c1,&c2);是从缓冲区中取两个字符,首先把第一次调用scanf(“%c%c”,&c1,&c2);后输入的回车当作输入字符赋值给c1 ,之后把a赋值给了c2
这就在输入逻辑上造成了混乱。
我们这样改一下
1 | #include <stdio.h>int main(){ char c1,c2; scanf("%c %c",&c1,&c2); //这里有一个空格 |
这下就会正确了
scanf(“ %c”,&c)这个空格(换成\n或者\t也可以),这样就把缓冲区中的回车当成第一个字符,读取后丢掉
可以很好理解: 空格( )即为读取一个结束字符然后丢掉,而普通的字符不受影响
用好之后可以避免很多程序BUG
当然我们也可以用getchar()来把之前的缓冲区里的回车删除掉,而不用 (空格) 这是getchar()的常用用法之一
1 | #include <stdio.h>int main(){ char c1,c2; scanf("%c %c",&c1,&c2); //这里有一个空格 |
再来一个下方加深理解:
1 | #include <stdio.h>char c1\[10\],c2\[10\];int main(){ |
若输入Hello World!的时候有空格 结果为下方:
输入完Hello World!之后按回车(Enter)直接执行完毕
因为在你输入Hello World!并且按下Enter(回车)的时候,Hello World!和Enter(回车)都会被送入到输入流缓冲区
而第一个scanf读取时遇到 空格 直接停止读取,所以c1为Hello 这时候第一个空格被释放
而第二个scanf继续从输入流缓冲区读取剩下的数据(World!)在读取完!之后有一个Enter(回车) 停止读取,直接执行Printf
程序运行完毕
4.scanf()在读取数字时会跳过空格、回车(Enter)、制表符和换行符!
getchar函数只能输入字符型,输入时遇到回车键才从缓冲区依次提取字符。
看下面的程序:
1 | #include <stdio.h>int main(){ int c1,c2; scanf("%d%d",&c1,&c2); //没有空格 |
输出结果正常,因为会自动跳过空格、回车(Enter)来进行读取
技能提升:
1gets
gets()以Enter结束输入,但可以接受空格,会舍弃最后的回车符!并且gets()可以读取多个字符,就像%c字符与getchar()对应
而%s字符串与gets()对称
需要用getchar()吃掉回车的几种情况:
前面有scanf 后面也要用scanf()时,中间要用一个空的getchar()吃回车;
前面有scanf,后面要用ch=getchar()接收字符时,中间要用一个空的getchar()吃回车;
2个ch=getchar()中间需要一个空的getchar()吃回车。
putchar于printf
这两个函数其实区别很明显,我们简单介绍下,明天还要交作业。。。i
1putchar
1 定义
putchar(a)向终端输出一个字符。,其中a可以是被单引号)引起来的一个字符[putchar(‘e’)],可以是介于0~127之间的一个十进制整型数(包含0和127)[putchar(23)] ,也可以是事先用char定义好的一个字符型变量 并且只能输出单个字符,于getchar()相对应
2printf()
1 定义
格式化输出函数, 用于向标准输出设备按规定格式输出信息, 并且可以输出各种数据类型,还可以有参数,而putchar只能输出一个字符
1 | 如printf("%c",'A') 相当于 putchar('A'); |
区别:
其实这两个都很容易理解了,并且区别也很明显,这里我们只做下简单讨论
*1.putchar会有返回值,并且返回值为()内参数值 *转换为的unsigned int 值 如果遇到错误或者文件结束,putchar() 返回EOF
而printf()函数返回值为字符串的长度。
1 | int a=104; |
技能提升:
puts():只能输出字符串 功能是将字符串输出到屏幕。输出时只有遇到 ‘\0’ 也就是字符串结束标志符才会停止
并且puts()在使用完之后会自动换行 等效于printf(“%s\n”,s)
puts()函数的返回值为0
习题演练:
在学习完之后,就来几道题巩固一下吧!
(1) c1与c2字符型与整数型皆可,
原因: 我们学习知道getchar返回的是字符的ASCⅡ码,而c1,c2若为字符型。则分别对应相对于字符,若为整数型则为对应ASCⅡ码 在用
printf("%c %c\\n",c1,c2);
putchar(c1);
putchar(c2);
输出的时候,字符型直接输出,而整数型的c1,c2 因为是%c和 putchar只能输出字符,会被转换为相对应ASCⅡ码值的字符输出
(2)应用printf(“%d %d\n”,c1,c2); 并且c1与c2字符型与整数型皆可
原因:%d为输出整数型,若 c1,c2为字符型,用%d会输出相对应的ASCⅡ码值,若为整数型直接输出
(3)不可以
原因:
char的范围是ASCII码范围:有符号char -128 ~ 127 无符号unsigned char :0 ~ 255
int的范围是-32768 ~ 32767
并且字符型为一个字节(无符号的为两个),一个字节转两个没问题,两个转一个就可能出现溢出问题。比如 char a=255,就会溢出,因为有符号字符表达的范围只是-128~127