scanf()函数输⼊格式⼤全
scanf函数
格式说明符:
%c    字符型
%d    ⼗进制数
%i    读⼊⼗进制,⼋进制,⼗六进制数。输⼊的时候正常是⼗进制数,若输⼊0前缀的数将读⼊⼋进制,0x前缀读⼊16进制。若输⼊09 则读⼊0,9进⼊缓冲区
%f    浮点数
%o    ⼋进制数
%s    字符串,碰到空格或回车结束
%x    16进制数
%p    指针
%n    ⾄此已读⼊值的等价字符数
1 #include <stdio.h>
2 #include <stdlib.h>
3int main()
4 {
5int a,x;
6char s[100];
7while(1)
8    {
9        fflush(stdin);
10        scanf("%d%n",&a,&x);
11        printf("%d %d\n",a,x);
12    }
13return0;
14 }
这个程序输⼊123会输出123 3。要注意的是,若没有fflush(stdin);第⼀次输⼊123的时候会输出123 3,第⼆次则会输出123 4。因为上次键⼊的回车也计算在内了。如果输⼊123之前多敲⼏次回车,则x的值要多相应的次数。因此,%u读⼊的是当前已读⼊的等价字符数。若将%n放在格式字符串的开头,则读⼊的数字为0。
%u    ⽆符号⼗进制数
[]      扫描字符集合,这个在后⾯说明。
%%  读⼊’%’字符
附加格式说明:
l        长度修饰符,输⼊“长”数据
h      长度修饰符,输⼊“短”数据
整型常数输⼊数据所占宽度。
如:
scanf(“%4d”,&a);
输⼊123456时,a的值为1234,56被加⼊缓冲区⽤于下次读⼊。
*      表⽰输⼊项不赋给变量。如:
scanf(“%d%*d%d”,&a,&b);
输⼊1 2 3 时,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()
函数原型:
int sscanf( const char *, const char *, ...);
int sscanf(const char *buffer,const char *format,[argument ]...);
buffer存储的数据
format格式控制字符串
argument 选择性设定字符串
sscanf会从buffer⾥读进数据,依照format的格式将数据写⼊到argument⾥。
sscanf与scanf类似,都是⽤于输⼊的,只是后者以键盘(stdin)为输⼊源,前者以固定字符串为输⼊源。
1. 常见⽤法。
char buf[512] ;
sscanf("123456 ", "%s", buf);//此处buf是数组名,它的意思是将123456以%s的形式存⼊buf中!
printf("%s\n", buf);
结果为:123456
效果和strcpy(buf,”123456”)相同,但可以有更多扩展的⽤法。
2. 取指定长度的字符串。如在下例中,取最⼤长度为4字节的字符串。
sscanf("123456 ", "%4s", buf);
printf("%s\n", buf);
结果为:1234
3. 取到指定字符为⽌的字符串。如在下例中,取遇到空格为⽌字符串。
sscanf("123456 abcdedf", "%[^ ]", buf);
printf("%s\n", buf);
结果为:123456
4. 取仅包含指定字符集的字符串。如在下例中,取仅包含1到9和⼩写字母的字符串。sscanf("123456abcdedfBCDEF", "%[1-9a-z]", buf);
printf("%s\n", buf);
结果为:123456abcdedf
当输⼊: sscanf("123456abcdedfBCDEF","%[1-9A-Z]",buf);
scanf输入整型数组printf("%s\n",buf);
结果为:123456
5. 取到指定字符集为⽌的字符串。如在下例中,取遇到⼤写字母为⽌的字符串。sscanf("123456abcdedfBCDEF", "%[^A-Z]", buf);
printf("%s\n", buf);
结果为:123456abcdedf
6、给定⼀个字符串iios/12DDWDFF@122,获取 / 和 @ 之间的字符串,
先将 "iios/"过滤掉,再将⾮'@'的⼀串内容送到buf中
sscanf("iios/12DDWDFF@122", "%*[^/]/%[^@]", buf);
printf("%s\n", buf);
结果为:12DDWDFF
7、给定⼀个字符串“hello, world”,仅保留world。
(注意:“,”之后有⼀空格,%s遇空格停⽌,加*则是忽略第⼀个读到的字符串)sscanf(“hello, world”, "%*s%s", buf);
printf("%s\n", buf);
结果为:world
%*s表⽰第⼀个匹配到的%s被过滤掉,即“hello,”被过滤了
如果没有空格则结果为NULL。
ACM使⽤案例:
HDU1106 排序
解题代码:
1 #include<stdio.h>
2 #include<stdlib.h>
3int cmp(int *a,int *b)
4 {
5return *a-*b;
6 }
7int main()
8 {
9char s[1005],*p,a[20];
10int b,x[1000],k,i;
11while(gets(s))
12    {
13        p=s;
14        k=0;
15do
16        {
17            sscanf(p,"%[^5]",a);
18if(*p!=0&&*p!='5')
19if(sscanf(a,"%d",&b)==1)
20            {
21                x[k]=b;
22                k++;
23            }
24while(*p!='5'&&*p!=0) p++;
25            p++;
26        }while(*(p-1)!=0);
27        qsort(x,k,sizeof(int),cmp); 28for(i=0;i<k;i++)
29        {
30if(i!=0) printf("");
31            printf("%d",x[i]);
32        }
33        printf("\n");
34    }
35return0;
36 }

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。