C语言入门·输入输出函数 scanf(),printf(),getchar()

scanf读取的是标准输入;
printf是标准输出;

目录

scanf函数

printf函数

仅需了解:getchar函数、putchar函数


scanf函数

scanf()

()里面填的参数:int scanf(const char *_restrict_,……)表示有返回值,返回值是读取数据成功的个数,const char *_restrict_是一个参数。

用法:scanf(" %c%d%f",&a,&b,&c);//char a; int  b; float c;,选择的是%c,还是%d,要看前面将变量定义为什么类型。

最好每次在%c前面都加一个空格​​​​​​。其它类型都不会识别\n,空格等字符,但是%c会识别。如果输入时,手动输入空格或者\n,其他类型会在缓冲区里进行识别,会忽略\n 或者空格(例:12345678如果不加空格的话,是一个数字,加入空格:12  34  56  78是4个不同的数字) ,但是%c可以识别空格或者\n,无法像上面那样,输入空格(例:helloworld→ hello  world,在输入到hello后的空格后,输入会被结束,后面的world无法输入),那么在scanf函数里含有一个空格,手动产生一个空格,才可以产生想要的结果。


原理:行缓冲:

        终端输入10,但是还没有按下回车键时,10就被存储在标准输入缓冲区。此时按下回车后,标准输入缓冲区内存储的是“10\n"。此时才会真正的执行输入输出操作,scanf函数才会开始匹配。

        在scanf("%d",&a);中,10 匹配到%d,寻找到变量a的地址(即取地址&),然后把10放入变量a。scanf匹配10的时候,10就被从缓冲区取出,而"\n"则留在缓冲区(%d的情况下,"\n"会被忽略掉),a里面存储的是10。但是如果是scanf("%c",&a);,"\n"也会被读取,此时a里面存储的是10\n。

        若缓冲区为空,则scanf函数会被卡住,被阻塞,不能继续往下执行(除%c外的其他类型下只输入空格或者\n也会被认为没有输入,缓冲区依旧为空)。若scanf要读取多个输入,第一个输入读取完成后,未能及时输入,scanf函数也会检测出来缓冲区为空,然后被阻塞。

        当然,10不一定是放在标准输入缓冲区,但会放在一个缓冲区里就是了。缓冲区的典型代表就是标准输入缓冲区和标准输出缓冲区。


printf函数

printf("name=%s,age=%d,sex=%c,score=%f\n","xiaoming",19,'m',93.5);
//输出:name=xiaoming,age=19,sex=m,score=93.500000
//这里浮点数的输出没有处理,最好处理一下

也就是说,后面写常量还是变量都可以,但是要前后匹配

↓↓↓复制粘贴的其他博主的:

printf()函数详解_望天际的博客-CSDN博客_printf函数感谢博主的分享:https://me.csdn.net/blog/K346K3461.printf()简介printf()是C语言标准库函数,用于将格式化后的字符串输出到标准输出。标准输出,即标准输出文件,对应终端的屏幕。printf()申明于头文件stdio.h。函数原型:int printf ( const char * format, ... );1返回值:正确返...https://blog.csdn.net/qq_25544855/article/details/81146800?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165502124916781432923299%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=165502124916781432923299&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-81146800-null-null.142%5Ev13%5Epc_search_result_control_group,157%5Ev14%5Econtrol&utm_term=printf%E5%87%BD%E6%95%B0&spm=1018.2226.3001.4187

    //a=1000
    printf("%d,%5d\n",20,a);     //将1000(默认右对齐)左边补空格
    printf("%d,%-5d\n",20,a);    //将1000左对齐,右边补空
    printf("%05d\n",a);          //前面补0
    printf("%+d,%+d\n",a,-1000); //输出正负号
    printf("% d % d\n",a,-a);    //正号用空格替代,负号输出;
    //由此可见“”里不一定非得是,只是是,时会输出,;如果是其它的符合也会输出

    printf("%.0f %#.0f\n",e,e);  //#的作用:当小数点后不输出值时依然输出小数点
    printf("%.4f\n",e);          //小数点后输出4位


输出结果:
20, 1000
20,1000 
01000
+1000,-1000
 1000 -1000
2 2.
2.3000
printf("%.8d\n",1000);          //不足指定宽度补前导0,效果等同于%06d
printf("%.8f\n",1000.123456789);//超过精度,截断
printf("%.8f\n",1000.123456);   //不足精度,补后置0
printf("%.8g\n",1000.123456);   //最大有效数字为8位
printf("%.8s\n",“abcdefghij”);  //超过指定长度截断


输出结果:
00001000
1000.12345679
1000.12345600
1000.1235
abcdefgh

getchar函数&&gets函数

getchar函数可以一次从标准输入读取一个字符,它等价于char c,scanf("%c",&c);getchar函数每次只能读取一个字符。

getchar函数运行时字符是连续输入的,运行结果却是正确的,这是因为输入字符后,它们暂存于键盘的缓冲区中,然后由getchar函数从键盘缓冲区中一个一个的取出来。就是如果输入了空格会认为输入字符串结束,空格后的字符将作为下一个输入项处理,但gets() 函数将接收输入的整个字符串直到回车为止。
scanf函数在读取字符串时遇到空格就认为读取结束,所以当输入的字符串在存在空格时,需要用到gets函数进行读取。

gets函数格式:char *gets(char *str);

读取过程:gets函数从STDIN(标准输入)读取字符并把它们加载到str(字符串)中,直到遇到换行符(\n)或者到达EOF。

putchar函数&&puts函数

putchar(x)

输出单个字符,x可以是一个字符常量、一个数组元素或一个整型数字(将输出其值所对应的编码符号,以ASCII码为例,当整型变量ch超出8位变量的范围时,ch则会变强制转化为8位变量(即取其低八位传过去输出),当为负数的时候,由于计算机存储负数是用补码表示的,所以传过去的二进制补码也被当做正数处理,也是取其低八位)。putchar函数每次可以输出一个字符,既可以是字符型变量,整型变量,又可以是常量。输出:putchar('H');

puts

和printf函数类似,格式:int puts(char *str);puts执行成功时返回非负值,执行失败时返回EOF。puts函数只能用于输出字符串,同时多打印一个换行符。(每次最后都会自动输出一个换行符)。

#include <stdio.h>
#include<stdlib.h>
//getchar函数用法

int main() 
{ 
    char c;
    c = getchar();
    printf("you input alphabet = %c\n",c);//alphabet:字母
    //思考,在printf函数后面再增加一个getchar函数,getchar函数会被阻塞吗?    

    return 0; 
}  
/**
    1、 输入:kakaka
        输出:k
    2、 输入:k
        输出:k
*/
#include<stdio.h>
#include<stdlib.h>

int main()
{
	char c[20];
	gets (c);
	puts (c);
	return 0;
}
/*
输入输出:
wenzomqaasdcds
wenzomqaasdcds

*/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Wmpreturn

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

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

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

打赏作者

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

抵扣说明:

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

余额充值