【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 无符号unsigned char :0 ~ 255

int的范围是-32768 ~ 32767

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

  • 45
    点赞
  • 155
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Z小旋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值