C语言scanf大全Word格式.docx
- 文档编号:4244843
- 上传时间:2023-05-03
- 格式:DOCX
- 页数:12
- 大小:18.36KB
C语言scanf大全Word格式.docx
《C语言scanf大全Word格式.docx》由会员分享,可在线阅读,更多相关《C语言scanf大全Word格式.docx(12页珍藏版)》请在冰点文库上搜索。
%a读入一个浮点值(仅C99有效)
%A同上
%c读入一个字符
%d读入十进制整数
%i读入十进制,八进制,十六进制整数
%o读入八进制整数
%x读入十六进制整数
%X同上
%s读入一个字符串
%f读入一个浮点数
%F同上
%e同上
%E同上
%g同上
%G同上
%p读入一个指针
%u读入一个无符号十进制整数
%n至此已读入值的等价字符数
%[]扫描字符集合
%%读%符号
附加格式说明字符表
修饰符说明
L/l长度修饰符输入"
长"
数据
h长度修饰符输入"
短"
W整型常数指定输入数据所占宽度
*星号空读一个数据
hh,ll同上h,l但仅对C99有效。
(B)空白字符
空白字符会使scanf()函数在读操作中略去输入中的一个或多个空白字符,空白符可以是space,tab,newline等等,直到第一个非空白符出现为止。
(C)非空白字符
一个非空白字符会使scanf()函数在读入时剔除掉与这个非空白字符相同的字符。
注:
scanf()控制串知识就介绍到这里(应该比较齐全了^_^),如有遗漏下次补上。
下面将结合实际例程,一一阐述.
三、scanf()函数的控制串的使用
例1.
显示代码打印
1#include"
stdio.h"
2intmain(void)
3{
4inta,b,c;
5
6scanf("
%d%d%d"
&
a,&
b,&
c);
7printf("
%d,%d,%d\n"
a,b,c);
8return0;
9}
运行时按如下方式输入三个值:
3□4□5 ↙(输入a,b,c的值)
3,4,5(printf输出的a,b,c的值)
(1)&
a、&
b、&
c中的&
是地址运算符,分别获得这三个变量的内存地址。
(2)"
是按十进值格式输入三个数值。
输入时,在两个数据之间可以用一个或多个空格、tab键、回车键分隔。
以下是合法输入方式:
①3□□4□□□□5↙
②3↙
4□5↙
③3(tab键)4↙
5↙
例2.
5scanf("
%d,%d,%d"
6printf("
7return0;
8}
3,4,5 ↙(输入a,b,c的值)
或者
3,□4,□5 ↙(输入a,b,c的值)
3,□□□4,□5 ↙(输入a,b,c的值)
......
都是合法的,但是"
"
一定要跟在数字后面,如:
3□,4,□5 ↙就非法了,程序出错。
(解决方法与原因后面讲)
再如:
1、sacnf()中的变量必须使用地址。
1 inta,b;
2scanf("
%d%d"
a,b);
//错误
3scanf("
b);
2、scanf()的格式控制串可以使用其它非空白字符,但在输入时必须输入这些字符。
例:
1scanf("
%d,%d"
输入:
3,4↙(逗号与"
中的逗号对应)
a=%d,b=%d"
a=3,b=4↙("
a="
b="
逗号与"
中的"
及逗号对应)
3、在用"
%c"
输入时,空格和“转义字符”均作为有效字符。
%c%c%c"
c1,&
c2,&
c3);
a□b□c↙
结果:
a→c1,□→c2,b→c3(其余被丢弃)
scanf()函数接收输入数据时,遇以下情况结束一个数据的输入:
(不是结束该scanf函数,scanf函数仅在每一个数据域均有数据,并按回车后结束)。
①遇空格、“回车”、“跳格”键。
②遇宽度结束。
③遇非法输入。
问题二:
scanf()函数不能正确接受有空格的字符串?
如:
Iloveyou!
1#include<
stdio.h>
2intmain()
4charstr[80];
%s"
str);
Iliveyou!
输出:
I
scanf()函数接收输入数据时,遇以下情况结束一个数据的输入:
所以,上述程序并不能达到预期目的,scanf()扫描到"
I"
后面的空格就认为对str的赋值结束,并忽略后面的"
loveyou!
.这里要注意是"
还在键盘缓冲区(关于这个问题,网上我所见的说法都是如此,但是,我经过调试发现,其实这时缓冲区字符串首尾指针已经相等了,也就是说缓冲区清空了,scanf()函数应该只是扫描stdin流,这个残存信息是在stdin中)。
我们改动一下上面的程序来验证一下:
01#include<
02intmain()
03{
04charstr[80];
05charstr1[80];
06charstr2[80];
07
08scanf("
/*此处输入:
Iloveyou!
*/
09printf("
10sleep(5);
/*这里等待5秒,告诉你程序运行到什么地方*/
11scanf("
str1);
/*这两句无需你再输入,是对键盘盘缓冲区再扫描*/
12scanf("
str2);
13printf("
\n%s"
14printf("
15return0;
16}
love
you!
好了,原因知道了,那么scanf()函数能不能完成这个任务?
回答是:
能!
别忘了scanf()函数还有一个%[]格式控制符(如果对%[]不了解的请查看本文的上篇),请看下面的程序:
01#include"
04charstring[50];
05
06/*scanf("
string);
不能接收空格符*/
07scanf("
%[^\n]"
08printf("
%s\n"
09return0;
10}
问题三:
键盘缓冲区残余信息问题
04inta;
05charc;
06do
07{
%d"
a);
09scanf("
10printf("
a=%dc=%c\n"
a,c);
11/*printf("
c=%d\n"
c);
*/
12}while(c!
='
'
N'
13}
scanf("
这句不能正常接收字符,什么原因呢?
我们用printf("
将C用int表示出来,启用printf("
这一句,看看scanf()函数赋给C到底是什么,结果是c=10,ASCII值为10是什么?
换行即\n.对了,我们每击打一下"
Enter"
键,向键盘缓冲区发去一个“回车”(\r),一个“换行"
(\n),在这里\r被scanf()函数处理掉了(姑且这么认为吧^_^),而\n被scanf()函数“错误”地赋给了c.
解决办法:
可以在两个scanf()函数之后加个fflush(stdin);
,还有加getch();
getchar();
也可以,但是要视具体scanf()语句加那个,这里就不分析了,读者自己去摸索吧。
但是加fflush(stdin);
不管什么情况都可行。
fflush
清除一个流
01intfflush(FILE*stream);
02#include<
03intmain()
04{
05inta;
06charc;
07do
08{
10fflush(stdin);
12fflush(stdin);
14}while(c!
15}
这里再给一个用“空格符”来处理缓冲区残余信息的示例:
运行出错的程序:
04inti;
05charj;
06for(i=0;
i<
10;
i++)
j);
/*这里%前没有空格*/
09}
使用了空格控制符后:
%c"
/*注意这里%前有个空格*/
可以运行看看两个程序有什么不同。
问题四如何处理scanf()函数误输入造成程序死锁或出错?
/*计算a+b*/
6c=a+b;
%d+%d=%d"
如上程序,如果正确输入a,b的值,那么没什么问题,但是,你不能保证使用者每一次都能正确输入,一旦输入了错误的类型,你的程序不是死锁,就是得到一个错误的结果,呵呵,这可能所有人都遇到过的问题吧?
解决方法:
scanf()函数执行成功时的返回值是成功读取的变量数,也就是说,你这个scanf()函数有几个变量,如果scanf()函数全部正常读取,它就返回几。
但这里还要注意另一个问题,如果输入了非法数据,键盘缓冲区就可能还个有残余信息问题。
正确的例程:
5while(scanf("
b)!
=2)fflush(stdin);
文章出处:
飞诺网():
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 scanf 大全