C语言输入输出函数总结

昨天参加完360的笔试感觉自己最近虽然学了一些理论知识但是在实际编程的时候还是有很多的路要走,一定要多多联系,昨天在写出入的时候就花了很久很久时间,今天特地花了一下午把C语言相关的输入输出函数做了个总结,希望以后不会再有这方面的问题了~ 下面为今天下午做的笔记,由于笔记是随看随记得,因此理解也是逐渐加深的,前面的内容大多数是自己根据程序结果做的猜想,可能有所偏差。对于scanf的学习大多来自于C语言scanf函数详细解释,讲解的非常详细!

一、printf函数:待补充

二、scanf函数:

这里做个补充,其实整理了一下午,最后得出的结论就是:在使用scanf时,按照格式化字符串的顺序挨个读入,符合当前的格式化字符串格式继续读下一格式,否则跳出scanf函数。理解了这个scanf就学明白了。
调用形式为: scanf("<格式化字符串>",<地址表>);----什么是格式化字符串—format???
返回值是int型,且大小为读入成功的参数的个数,当读取失败时返回EOF;
对于scanf函数,读取的是缓冲区内存入的数据,在输入数据时首先是存放在缓冲区内,再由scanf根据格式一个一个读取;
读取的格式有:%a 读入一个浮点值(仅C99有效)
%A 同上
%c 读入一个字符
%d 读入十进制整数
%i 读入十进制,八进制,十六进制整数
%o 读入八进制整数
%x、%X 读入十六进制整数
%s 读入一个字符串
%f、%F、%e、%E、%g、%G 读入一个浮点数
%p 读入一个指针
%u 读入一个无符号十进制整数
%n 至此已读入值的等价字符数
%[] 扫描字符集合
%% 读%符号
猜测?:
空字符(TAB、空格、换行),此类字符直接略过,留在缓冲区内;但是这些字符是有作用的,换行表示间隔/输入完成(接受变量数量足够时),空格分隔同类型数据。
非空字符,读取后将其在缓冲区内删除。
scanf输入规则:结束对一个数据接受的情况:
(1).接收到空格、回车、Tab时
(2).遇宽度结束
(3).非法输入(输入与类型不符直接结束scanf语句–这是大多数用scanf出现错误的本质原因)
当输入类型为字符时,空格、换行等都会当做字符输入。
对于要读的数据类型和缓冲区的数据类型不同时,直接退出scanf函数,如:scanf("%d%d",&a,&b);
输入2 b
想要读取两个整型数据,先读取到2符合,存到了a;然后读到空格,忽略;(直接输2b结果一样)。
在读取b字符型不是整型,退出scanf()函数,b变量并未被赋值。此时,缓冲区中剩余字符b。
然后执行
scanf("%c",&c);
因为缓冲区中有字符b,直接读取b,存到了c变量。
提供两个清空缓冲区的函数:fflush( stdin ); 、 scanf("%[^\n]%c");//这里的stdin为标准输入,大概就是那个缓冲区?
当scanf的输入数据类型为字符串(%s)时,由于%s,即整个字符串即便再多的字符也只是一个数据,因此遇到空格、回车、Tab时结束对字符串的输入。
那如何接受字符串数据?用%[]——扫描字符集合–%[^\n]的含义是,扫描到’\n’就退出scanf,然后把缓冲区内的字符串存入到scanf中的地址变量内,通常用一个数来存储。
举个例子,在今年360笔试编程第一题时系统会输入长度不确定的两行相同长度字符串,scanf我是这么写的:

char a[50],b[50];
scanf("%[^\n]",a);//接受第一行,输入为'\n'则退出,并在字符串结尾添加'\0'																												
getchar();//把缓冲区内的换行符拿掉																												
scanf("%[^\n]",b);//接受第二行,输入为'\n'则退出,并在字符串结尾添加'\0'																												
while(a[lenth] != '\0') lenth++;//获取字符串长度

另外一种获取输入的思路是:

do{																													
scanf("%c",a);																													
a++; lenth++;																												
}while(*(a-1) != '\n');																												
getchar();																												
do{																													
scanf("%c",b);																													
b++; 																												
}while(*(b-1) != '\n');																										
//似乎略微麻烦一些;而且a和b的指针被修改了需要加一个临时指针变量存储,这里
的lenth初始化为-1.

防止程序输入出现死锁或错误,可以采用如下格式:

while(scanf("%d,%d",&a,&b)!=2) fflush(stdin); //利用scanf返回值为接收到
的参数

有关scanf的其他好用的功能:
(一)、scanf( “%[1234567890]”,strings); 只要输入的字符属于0-9;则继续输入,否则退出。
(二)、scanf("%[^1234567890]",strings); 只要输入的字符属于0-9;则退出,否则继续输入。因此这个方法可以用来解决输入不能有空格的问题。
下面开始就是对scanf的本质理解了
这里看一下scanf函数的原型:int scanf( const char *format, … );
format修饰的为格式化字符(这大概就是printf和scanf叫做格式化输入输出的原因吧),格式化字符包括三种,分别为:格式说明符(%开头)、空白字符、非空白字符。
比如:printf("%d,%d\n"); 这里的%d就是格式说明符,这里的’,‘是非空白字符,’\n’为空白字符,他们共同组成了scanf或者printf的第一个参数。
对于scanf函数根据这些格式化字符对于输入的数据进行判断:
1;格式化字符:读到的内容应该是该字符指定的类型,若符合存到参数指定的地址内,否则跳出scanf。
2;非空字符:读到一个匹配的内容并忽略之,如果不匹配跳出scanf;
3;空字符:本质上就是读到空字符但不保存,直到读到非空字符为止。(想想和前两个不是一样吗,读到不是空字符直接跳出scanf;读到空字符就继续读,直到不是空字符了就继续读接下来的格式。多个空字符放在一起是不是也仍然是一个空字符…)
所以比较三者其实本质上是一样的,按顺序读入,只要符合内容就继续读下一格式,不符合内容就跳出scanf。这里注意%c指的字符既包括空字符也包括非空字符。
现在一想,"[0123456789]",就是把0-9;这些字符打包起来而已,[]便是起到打包作用的符号~

三、putchar()函数:

等同于printf("%c",str);

四、getchar()函数:

从stdin中读出一个字符,这里要注意的是:其函数原型为int getchar(void); 返回值为int型。

五、puts()函数:

输出打印一句话 自带回车换行,可以理解为把字符串末尾的’\0’转换成’\n’。

六、gets()函数:

接收输入的一行 到\n 结束,可以理解为把接收到的’\n’转换为’\0’。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值