scanf函数

格式说明符:

%c    字符型

%d    十进制数

%i     读入十进制,八进制,十六进制数。输入的时候正常是十进制数,若输入0前缀的数将读入八进制,0x前缀读入16进制。若输入09 则读入0,9进入缓冲区

%f     浮点数

%o    八进制数

%s    字符串,碰到空格或回车结束

%x    16进制数

%p    指针

%n    至此已读入值的等价字符数

 #include <stdio.h>
#include <stdlib.h>
int main()
{
int a,x;
char s[];
while()
{
fflush(stdin);
scanf("%d%n",&a,&x);
printf("%d %d\n",a,x);
}
return ;
}

这个程序输入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);就可以了。

更多详情可以参见百度百科:

http://baike.baidu.com/link?url=cdubSucYQDAuEwnRHcEYD81eRmaltW_CxqZmnppLfqJLL7E74Kjl0cAPSo4uoR5H13uqdi9Mo7zTEX-jagQxaK

进阶:

函数: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);

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 排序

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1106

解题代码:

 #include<stdio.h>
#include<stdlib.h>
int cmp(int *a,int *b)
{
return *a-*b;
}
int main()
{
char s[],*p,a[];
int b,x[],k,i;
while(gets(s))
{
p=s;
k=;
do
{
sscanf(p,"%[^5]",a);
if(*p!=&&*p!='')
if(sscanf(a,"%d",&b)==)
{
x[k]=b;
k++;
}
while(*p!=''&&*p!=) p++;
p++;
}while(*(p-)!=);
qsort(x,k,sizeof(int),cmp);
for(i=;i<k;i++)
{
if(i!=) printf(" ");
printf("%d",x[i]);
}
printf("\n");
}
return ;
}

【ACM非算法部分】scanf()函数的更多相关文章

  1. 【ACM非算法部分】综合篇

    从零开始系列,也为了更好的补缺补漏. ===================== 目录: scanf()函数 STL汇总 读入优化 =====================

  2. 【ACM非算法部分】STL汇总

    stackqueuepriority_queuemapsetpair ====================================== stack:(栈) 包含:#include<s ...

  3. 【ACM非算法部分】读入优化

    今天做了ACdream的比赛才知道原来还有读入优化这一说.Orz 读入一个整数的时候这么写: int a; scanf("%d",&a); 和 int a; char c; ...

  4. ACM常用算法及练习(1)

    ACM常用算法及练习 第一阶段:练经典常用算法,下面的每个算法给我打上十到二十遍,同时自己精简代码,因为太常用,所以要练到写时不用想,10-15分钟内打完,甚至关掉显示器都可以把程序打出来. 1.最短 ...

  5. ACM主要算法

    ACM主要算法ACM主要算法介绍 初期篇 一.基本算法(1)枚举(poj1753, poj2965)(2)贪心(poj1328, poj2109, poj2586)(3)递归和分治法(4)递推(5)构 ...

  6. C语言scanf函数详细解释

    原文链接 函数名: scanf 功 能: 执行格式化输入 用 法: int scanf(char *format[,argument,...]); scanf()函数是通用终端格式化输入函数,它从标准 ...

  7. acm常见算法及例题

    转自:http://blog.csdn.net/hengjie2009/article/details/7540135 acm常见算法及例题  初期:一.基本算法:     (1)枚举. (poj17 ...

  8. ACM常用算法及练习(2)

    ACM常用算法及练习 知识类型 重要度 容易度 应掌握度 典型题 其他           数据结构(5) 链表 ★★☆ ★★★ ★★☆     栈 stack ★★★ ★★★ ★★★ HLoj120 ...

  9. 黑马程序员——C语言基础 scanf函数 基本运算 三目运算符

    Java培训.Android培训.iOS培训..Net培训.期待与您交流! (一下内容是对黑马苹果入学视频的个人知识点总结) (一)scanf函数 1>  简单介绍一下scanf函数   这是在 ...

随机推荐

  1. URAL - 1900 Brainwashing Device

    While some people travel in space from planet to planet and discover new worlds, the others who live ...

  2. oracle 数据泵

      Oracle数据库导入导出工具,可以使用exp/imp,但这是比较早期的工具.本文主要介绍数据泵expdp/impdp工具的使用.   1.建立数据泵目录 使用数据泵需要先建directory c ...

  3. Json日期格式 转化为 YYYY-MM-DD-hh-mm-ss

    function timeStamp2String(time) { var datetime = new Date(); datetime.setTime(time); var year = date ...

  4. 高通平台下安卓opencl小例子

    http://blog.csdn.net/wcj0626/article/details/26272019 先到高通的qdn下载adreno GPU SDK,里面有OpenCL的例子.https:// ...

  5. 【Java Web】把逻辑名映射到servlet文件

    Ⅰ.请求URL Ⅱ.容器搜索DD,查找servlet-mapping <?xml version="1.0" encoding="ISO-8859-1" ...

  6. adjacent cache line prefetch

    adjacent cache line prefetch 预读取邻近的缓存数据. 计算机在读取数据时,会智能的认为要读取的数据旁边或邻近的数据也是需要的, 那么其在处理的时候就会将这些邻近的数据预先读 ...

  7. Intellij IDear关闭页面浏览器显示图标

    如在xml页面或html页面,右上角老显示 看着特别不爽,可以如此关闭 第一步 File->setting 第二步

  8. jQ&js给label

    <strong>当前角色:</strong><label id="lblRoleName" style="margin-bottom: 0p ...

  9. Google protobuf序列化以及反序列化

    序列化的目的是将对象持久化到硬盘或者用于网络传输.java也提供了序列化技术,非常简单,只要实现Serializable接口即可.如下: public class commonService impl ...

  10. Codeforces Round #364 (Div. 2) C. They Are Everywhere 尺取法

    C. They Are Everywhere time limit per test 2 seconds memory limit per test 256 megabytes input stand ...