
scanf的用法
-
2023年3月20日发(作者:怀特森)scanf()函数输⼊格式⼤全
scanf函数
格式说明符:
%c字符型
%d⼗进制数
%i读⼊⼗进制,⼋进制,⼗六进制数。输⼊的时候正常是⼗进制数,若输⼊0前缀的数将读⼊⼋进制,0x前缀读⼊16进制。若输⼊09则
读⼊0,9进⼊缓冲区
%f浮点数
%o⼋进制数
%s字符串,碰到空格或回车结束
%x16进制数
%p指针
%n⾄此已读⼊值的等价字符数
1#include
2#include
3intmain()
4{
5inta,x;
6chars[100];
7while(1)
8{
9fflush(stdin);
10scanf("%d%n",&a,&x);
11printf("%d%dn",a,x);
12}
13return0;
14}
这个程序输⼊123会输出1233。要注意的是,若没有fflush(stdin);第⼀次输⼊123的时候会输出1233,第⼆次则会输出1234。因为上次键⼊
的回车也计算在内了。如果输⼊123之前多敲⼏次回车,则x的值要多相应的次数。因此,%u读⼊的是当前已读⼊的等价字符数。若将%n放
在格式字符串的开头,则读⼊的数字为0。
%u⽆符号⼗进制数
[]扫描字符集合,这个在后⾯说明。
%%读⼊’%’字符
附加格式说明:
l长度修饰符,输⼊“长”数据
h长度修饰符,输⼊“短”数据
整型常数输⼊数据所占宽度。
如:
scanf(“%4d”,&a);
输⼊123456时,a的值为1234,56被加⼊缓冲区⽤于下次读⼊。
*表⽰输⼊项不赋给变量。如:
scanf(“%d%*d%d”,&a,&b);
输⼊123时,a为1,b为3,2被跳过不赋给任何变量。
[]:
1
%[ABC]
使⽤扫描集时,scanf()连续吃进集合中的字符并放⼊对应的字符数组,直到发现不在集合中的字符为⽌(即扫描集仅读匹配的字符)。返回
时,数组中放置以null结尾、由读⼊字符组成的字符串。
⽤字符^可以说明补集。把^字符放为扫描集的第⼀字符时,构成其它字符组成的命令的补集合,指⽰scanf()只接受未说明的其它字符。
对于许多实现来说,⽤连字符可以说明⼀个范围。例如,以下扫描集使scanf()接受字母A到Z:%[A-Z]
重要的是要注意扫描集是区分⼤⼩写的。因此,希望扫描⼤、⼩写字符时,应该分别说明⼤、⼩写字母。
%[^A]读⼊字符串以A结尾。如输⼊SDFASDF则读⼊的字符串为SDF。要注意的是,读⼊的时候只以A为结尾,空格和回车都不能结束输
⼊。
要⽤scanf实现gets的功能,只需要这样写:scanf("%[^n]",s);就可以了。
更多详情可以参见百度百科:
进阶:
函数:sscanf()
函数原型:
intsscanf(constchar*,constchar*,...);
intsscanf(constchar*buffer,constchar*format,[argument]...);
buffer存储的数据
format格式控制字符串
argument选择性设定字符串
sscanf会从buffer⾥读进数据,依照format的格式将数据写⼊到argument⾥。
sscanf与scanf类似,都是⽤于输⼊的,只是后者以键盘(stdin)为输⼊源,前者以固定字符串为输⼊源。
1.常见⽤法。
charbuf[512];
sscanf("123456","%s",buf);//此处buf是数组名,它的意思是将123456以%s的形式存⼊buf中!
printf("%sn",buf);
结果为:123456
效果和strcpy(buf,”123456”)相同,但可以有更多扩展的⽤法。
2.取指定长度的字符串。如在下例中,取最⼤长度为4字节的字符串。
sscanf("123456","%4s",buf);
printf("%sn",buf);
结果为:1234
3.取到指定字符为⽌的字符串。如在下例中,取遇到空格为⽌字符串。
sscanf("123456abcdedf","%[^]",buf);
printf("%sn",buf);
结果为:123456
4.取仅包含指定字符集的字符串。如在下例中,取仅包含1到9和⼩写字母的字符串。
sscanf("123456abcdedfBCDEF","%[1-9a-z]",buf);
printf("%sn",buf);
结果为:123456abcdedf
当输⼊: sscanf("123456abcdedfBCDEF","%[1-9A-Z]",buf);
printf("%sn",buf);
结果为:123456
5.取到指定字符集为⽌的字符串。如在下例中,取遇到⼤写字母为⽌的字符串。
sscanf("123456abcdedfBCDEF","%[^A-Z]",buf);
printf("%sn",buf);
结果为:123456abcdedf
6、给定⼀个字符串iios/12DDWDFF@122,获取/和@之间的字符串,
先将"iios/"过滤掉,再将⾮'@'的⼀串内容送到buf中
sscanf("iios/12DDWDFF@122","%*[^/]/%[^@]",buf);
printf("%sn",buf);
结果为:12DDWDFF
7、给定⼀个字符串“hello,world”,仅保留world。
(注意:“,”之后有⼀空格,%s遇空格停⽌,加*则是忽略第⼀个读到的字符串)
sscanf(“hello,world”,"%*s%s",buf);
printf("%sn",buf);
结果为:world
%*s表⽰第⼀个匹配到的%s被过滤掉,即“hello,”被过滤了
如果没有空格则结果为NULL。
ACM使⽤案例:
HDU1106排序
解题代码:
1#include
2#include
3intcmp(int*a,int*b)
4{
5return*a-*b;
6}
7intmain()
8{
9chars[1005],*p,a[20];
10intb,x[1000],k,i;
11while(gets(s))
12{
13p=s;
14k=0;
15do
16{
17sscanf(p,"%[^5]",a);
18if(*p!=0&&*p!='5')
19if(sscanf(a,"%d",&b)==1)
20{
21x[k]=b;
22k++;
23}
24while(*p!='5'&&*p!=0)p++;
25p++;
26}while(*(p-1)!=0);
27qsort(x,k,sizeof(int),cmp);
28for(i=0;i 29{ 30if(i!=0)printf(""); 31printf("%d",x[i]); 32} 33printf("n"); 34} 35return0; 36}