✅ 操作成功!

scanf的用法

发布时间:2023-06-16 作者:admin 来源:文学

scanf的用法

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}

👁️ 阅读量:0