700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 【C语言】C语言学习整理-putchar printf getchar scanf定义及区别

【C语言】C语言学习整理-putchar printf getchar scanf定义及区别

时间:2021-08-07 14:17:50

相关推荐

【C语言】C语言学习整理-putchar printf getchar scanf定义及区别

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码,并且可以赋值也可以不赋值。

scanf("%d",&a);getchar();ch = getchar(); //两者都正确

2.结束输入的方式不同

scanf遇到 回车(enter),空格,TAB 就会结束一次输入,空格不会接收

getchar函数只以回车Enter结束输入,接受空格符。

3.

scanf在一次输入结束后,不会舍弃最后的回车符(即回车符会残留在缓冲区中)

getchar回车作为结束的标志,所以在敲回车时'\n'也被存入缓存

看下面的程序:

#include <stdio.h>int main(){char c1,c2;scanf("%c %c",&c1,&c2); //这里有一个空格printf("%d %d\n",c1,c2);scanf("%c%c",&c1,&c2);printf("%d %d\n",c1,c2);return 0;}

第一次输入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

这就在输入逻辑上造成了混乱。

我们这样改一下

#include <stdio.h>int main(){char c1,c2;scanf("%c %c",&c1,&c2); //这里有一个空格printf("%d %d\n",c1,c2);scanf(" %c %c",&c1,&c2); //这里也有了空格printf("%d %d\n",c1,c2);return 0;}

这下就会正确了

scanf(" %c",&c)这个空格(换成\n或者\t也可以),这样就把缓冲区中的回车当成第一个字符,读取后丢掉

可以很好理解: 空格( )即为读取一个结束字符然后丢掉,而普通的字符不受影响

用好之后可以避免很多程序BUG

当然我们也可以用getchar()来把之前的缓冲区里的回车删除掉,而不用 (空格) 这是getchar()的常用用法之一

#include <stdio.h>int main(){char c1,c2;scanf("%c %c",&c1,&c2); //这里有一个空格printf("%d %d\n",c1,c2);getchar(); //吸收回车缓存scanf("%c %c",&c1,&c2); //这里也有了空格printf("%d %d\n",c1,c2);return 0;}

再来一个下方加深理解:

#include <stdio.h>char c1[10],c2[10];int main(){ scanf("%s",&c1);printf("%s\n",c1);scanf(" %s",&c2); printf("%s",c2);return 0;}

若输入Hello World!的时候有空格 结果为下方:

输入完Hello World!之后按回车(Enter)直接执行完毕

因为在你输入Hello World!并且按下Enter(回车)的时候,Hello World!和Enter(回车)都会被送入到输入流缓冲区

而第一个scanf读取时遇到 空格 直接停止读取,所以c1为Hello 这时候第一个空格被释放

而第二个scanf继续从输入流缓冲区读取剩下的数据(World!)在读取完!之后有一个Enter(回车) 停止读取,直接执行Printf

程序运行完毕

4.scanf()在读取数字时会跳过空格、回车(Enter)、制表符和换行符!

getchar函数只能输入字符型,输入时遇到回车键才从缓冲区依次提取字符。

看下面的程序:

#include <stdio.h>int main(){int c1,c2;scanf("%d%d",&c1,&c2); //没有空格printf("%d %d\n",c1,c2);scanf("%d%d",&c1,&c2); //没有空格printf("%d %d\n",c1,c2);return 0;}

输出结果正常,因为会自动跳过空格、回车(Enter)来进行读取

技能提升:

1gets

gets()以Enter结束输入,但可以接受空格,会舍弃最后的回车符!并且gets()可以读取多个字符,就像%c字符与getchar()对应

而%s字符串与gets()对称

需要用getchar()吃掉回车的几种情况:

1.前面有scanf 后面也要用scanf()时,中间要用一个空的getchar()吃回车;

2. 前面有scanf,后面要用ch=getchar()接收字符时,中间要用一个空的getchar()吃回车;

3. 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只能输出一个字符

如printf("%c",'A') 相当于 putchar('A');

区别:

其实这两个都很容易理解了,并且区别也很明显,这里我们只做下简单讨论

1.putchar会有返回值,并且返回值为()内参数值转换为的unsigned int 值如果遇到错误或者文件结束,putchar() 返回EOF

而printf()函数返回值为字符串的长度。

int a=104;printf(%d",a); //printf将返回3,printf("123\n"); //printf将返回4

技能提升:

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无符号unsignedchar :0~255

int的范围是-32768~32767

并且字符型为一个字节(无符号的为两个),一个字节转两个没问题,两个转一个就可能出现溢出问题。比如 char a=255,就会溢出,因为有符号字符表达的范围只是-128~127

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。