当前位置: 首页 > 编程日记 > 正文

c语言函数库学习~sscanf~格式化输入

---恢复内容开始---

今天算是被打击到了吧,由郑轻的acm老师来我学院指导安排了个现场的小比赛,,俺们居然有还是输给一个大一的新手,,哎,情何以堪,,所以还是要重视下基础编程能力的培训,现在嘛我就开始学习下格式化的输入,,很复杂但是很有效果的。。。

sscanf() - 从一个字符串中读进与指定格式相符的数据.

Int sscanf( string str, string fmt, mixed var1, mixed var2 ... ); 
  int scanf( const char *format [,argument]... );

sscanf与scanf类似,都是用于输入的,只是后者以屏幕(stdin)为输入源,前者以固定字符串为输入源。

参有几种特殊的符号表示。

1、 * 亦可用于格式中, (即 %*d 和 %*s) 加了星号 (*) 表示跳过此数据不读入. (也就是不把此数据读入参数中) 
  2、{a|b|c}表示a,b,c中选一,[d],表示可以有d也可以没有d。 
  3、width表示读取宽度。 
  4、{h | l | I64 | L}:参数的size,通常h表示单字节size,I表示2字节 size,L表示4字节size(double例外),l64表示8字节size。 
  5、type :这就很多了,就是%s,%d之类。 
  6、特别的:%*[width] [{h | l | I64 | L}]type 表示满足该条件的被过滤掉,不会向目标参数中写入值 
  支持集合操作: 
  %[a-z] 表示匹配a到z中任意字符,贪婪性(尽可能多的匹配) 
  %[aB'] 匹配a、B、'中一员,贪婪性 
  %[^a] 匹配非a的任意字符,贪婪性

我们可以看看测试数据。。

#include<stdio.h>
int main()
{
char buf[10];
sscanf("hello, world","%*s%s",buf);//这里要考虑到%s是到空格结束,,所以第一个%s就被*忽略了。//sscanf("hello,\\nworld","%*s%s",buf);这里用\\n也是同样的原来
printf("%s\n",buf);
}

sscanf("hello, world", "%5s", buf);获取前五个字符

当然你也会想能不能把数字做为字符存到数组中我们来看看、

#include<stdio.h>
#include<string.h>
int main()
{
char buf1[100],buf2[100];
int a;
double b;
scanf("%d",&a);
scanf("%lf",&b);//测试小数是否可以转
//itoa(a,buf,10);这个函数也可以实现数字转字符,10代表进制
sprintf(buf1,"%d",a);
sprintf(buf2,"%lf",b);//这里注意他会把点号也输入
printf("字符型的int :%s\n ",buf1);//这里直接输出a不过是作为字符的
printf("字符型的doubl :%s\n ",buf2);//同上
printf("int 长度:%d\n",strlen(buf1));//可以用于计算位数
printf("doubl 长度:%d\n",strlen(buf2));//长度上是包含了点的
}

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是针对一串字符找到符合%【1-9a-z】直接存放到buf中,然后然后跳出语句,所以在这个语句中只要遇到不识别的比如  E就会直接结束,返回
  123456
  else
  123456abcdedf

如下
  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

这里可以用做校验输入的是否是标准的邮箱格式,

#include<stdio.h>
int main()
{
char a[100],b[100],c[100],d[100];
int i , j , l ;
scanf("%s",a);
sscanf(a,"%[^@]@%[^.].%s",b,c,d);//这里遇到不是@的一律给b后面类推
printf("%s @ %s . %s\n",b,c,d);
}//最后能够单独分离出来就能单独的处理了。所以不多说


  7、给定一个字符串““hello, world”,仅保留world。(注意:“,”之后有一空格) 
  sscanf(“hello, world”, "%*s%s", buf); 
  printf("%s\n", buf); 
  结果为:world 
  %*s表示第一个匹配到的%s被过滤掉,即hello被过滤了 
  如果没有空格则结果为NULL。 
  sscanf的功能很类似于正则表达式, 但却没有正则表达式强大,所以如果对于比较复杂的字符串处理,建议使用正则表达式. 
  //------------------------------------------------------- 
  sscanf,表示从字符串中格式化输入 
  上面表示从str中,输入数字给x,就是32700 
  久以前,我以为c没有自己的split string函数,后来我发现了sscanf;一直以来,我以为sscanf只能以空格来界定字符串,现在我发现我错了。 
  sscanf是一个运行时函数,原形很简单: 
  int sscanf( 
  const char *buffer, 
  const char *format [, 
  argument ] ... 
  ); 
  它强大的功能体现在对format的支持上。 
  我以前用它来分隔类似这样的字符串2006:03:18: 
  int a, b, c; 
  sscanf("2006:03:18", "%d:%d:%d", a, b, c); 
  以及2006:03:18 - 2006:04:18: 
  char sztime1[16] = "", sztime2[16] = ""; 
  sscanf("2006:03:18 - 2006:04:18", "%s - %s", sztime1, sztime2); 
  但是后来,我需要处理2006:03:18-2006:04:18 
  仅仅是取消了‘-’两边的空格,却打破了%s对字符串的界定。 
  我需要重新设计一个函数来处理这样的情况?这并不复杂,但是,为了使所有的代码都有统一的风格,我需要改动很多地方,把已有的sscanf替换成我自己的分割函数。我以为我肯定需要这样做,并伴随着对sscanf的强烈不满而入睡;一觉醒来,发现其实不必。 
  format-type中有%[]这样的type field。如果读取的字符串,不是以空格来分隔的话,就可以使用%[]。 
  %[]类似于一个正则表达式。[a-z]表示读取a-z的所有字符,[^a-z]表示读取除a-z以外的所有字符。 
  所以那个问题也就迎刃而解了: 
  sscanf("2006:03:18 - 2006:04:18", "%[0-9,:] - %[0-9,:]", sztime1, sztime2);

最后还有个原创的测试。如果我想判断第一个是不是我需要的元素,那么可以使用|或|的操作,那么要怎么写代码呢。

#include<stdio.h>
int main()
{
char buf[10]={0},buf1[10]={0};
sscanf("hello,world","%[{h}]%[{e}]s",buf,buf1);
printf("%s\n%s",buf,buf1);
}

这里要注意因为如果你的%[{e}]中的e写的是l的话是没有任何答案的,因为读取到e的时候没有对应的代码所以就会直接跳过。或者说是停止读取。

---恢复内容结束---

转载于:https://www.cnblogs.com/luyi14/p/4100301.html

相关文章:

java mobile phone games_j2me100-src Java

文件名大小更新时间codesc.net\[J2SE]应用编程150例\chap01\实例1\BorderLayoutDemo.class8192003-07-07codesc.net\[J2SE]应用编程150例\chap01\实例1\BorderLayoutDemo.java5752003-07-07codesc.net\[J2SE]应用编程150例\chap01\实例1\BoxLayoutFrame.class7262003-07-15code…

***突然断开可能是ADSL猫惹的祸

在我们使用服务器的时候&#xff0c;最讨厌的就是无故的断线了&#xff0c;可能正在和好一起副本&#xff0c;或者正在视频热聊中&#xff0c;还或者youtube视频看的正起劲&#xff0c;突然windows一个对话框弹出 - “连接已经断开”。实在是太影响体验了&#xff0c;断开之后&…

文件中数组的最大值及其对应的最小下标

2019年春季学期第二周作业基础作业请在第一周作业的基础上&#xff0c;继续完成&#xff1a;找出给定的文件中数组的最大值及其对应的最小下标&#xff08;下标从0开始&#xff09;。并将最大值和对应的最小下标数值写入文件。 输入&#xff1a;请建立以自己英文名字命名的txt文…

ceph bluestore源码分析:admin_socket实时获取内存池数据

环境&#xff1a; 版本&#xff1a;ceph 12.2.1 部署完cephfs 使用ceph-fuse挂载&#xff0c;并写入数据 关键参数&#xff1a; debug_mempool true 将该参数置为true即可查看详细的blustore管理的内存池的数据 命令&#xff1a; ceph daemon osd.id dump_mempools该命令为ad…

java clob内存溢出_java - java.sql.SQLException:ORA-01704:字符串文字太长时插入或更新 - 堆栈内存溢出...

通常&#xff0c;当我插入4000个字符限制时&#xff0c;它的工作正常&#xff0c;但当超过4000个字符时&#xff0c;它抛出SQL异常字符串文字太长&#xff0c;即使我的DISCHARGE_TEXT数据类型是CLOB我的JavaScript代码是function saveAsDraftNew(){var admissionNo document.g…

LC并联谐振回路

转载于:https://www.cnblogs.com/prayer521/p/4103091.html

zencart分类页产品页去掉url中的id号

最近公司新上的网站被seo指出要修改url&#xff0c;去掉url中产品id。由于我们用的是zencart框架&#xff0c;装了 Ultimate SEO URLs 插件&#xff0c;所以在网上应该有这方面的资料&#xff0c;本文主要参考资料&#xff1a;原网址&#xff1a;修改seo url中去掉产品id的方法…

hexo博客更新主题后上传Git操作

克隆主题: git clone https://github.com/SuperKieran/TKL.git _config.yml文件中主题改为新增主题 # Extensions ## Plugins: https://hexo.io/plugins/ ## Themes: https://hexo.io/themes/ theme: TKL 进入主题目录,更新git cd theme/TKL git pull 执行更新 hexo clean hex…

ceph bluestore源码分析:非对齐写逻辑

文章目录环境原理说明总结环境 ceph:12.2.1 场景&#xff1a;ec 21 部署cephfs&#xff0c;执行如右写模式:dd if/dev/zero of/xxx/cephfs bs6K count4 oflagdirect 关键配置&#xff1a; bluestore_min_alloc_size_hdd 65536 bluestore分配空间的最小粒度 单位&#xff1a;B…

JVM系列(之ClassLoader)

Class Loader Java运作流程 内部class loader bootstrap class loader --引导类加载器&#xff0c;它负责加载Java的核心类【java.* 】&#xff08;如classpath下面的类库&#xff09;&#xff0c;不是 java.lang.ClassLoader的子类&#xff0c;而是由JVM自身实现的。Code . UR…

java平台类成员访问修饰符_JAVA类的修饰符及访问权限

1.类外部类 class前的修饰符只能有publicfinalabstrct无(默认) &#xff1a;同包可见 (Eclipse中选择package)内部类 class前的修饰符有public、protected、private、默认、final、abstract、static。先看类的访问权限&#xff0c;再看成员的访问权限&#xff0c;类…

ios实例开发精品源码文章推荐

1、IOS代码分享:视图布局&#xff08;View Layout&#xff09;Border View140601bvpw22rir88b9i8i.png(19.97 KB, 下载次数: 0)下载附件保存到相册半小时前 上传http://www.apkbus.com/android-101999-1-14.html2、IOS代码分享&#xff1a;导航条&#xff08;Navigation Bar&am…

Spring BeanDefinitionRegistryPostProcessor BeanPostProcessor作用

写博客&#xff0c;写博客&#xff0c;把自己知道的小知识点全部记录&#xff0c;? BeanDefinitionRegistryPostProcessor 接口属于Beanddefination 装配定义的范畴&#xff0c;此时bean 并没有初始化 BeanPostProcessor属于be an 实例化修改的范畴&#xff0c;be an 已经进行…

关于ceph源码 backtrace 打印函数调用栈

当集中精力看一个问题的时候&#xff0c;时间久了就会有这样一个状态&#xff0c;天空飘来五个字&#xff0c;那都不算事 ceph源码庞大的体量以及复杂的设计让很多人望而却步&#xff0c;尤其是大量的纯虚函数更是让读者迷失在代码的海洋&#xff0c;这个时候函数调用栈是一个救…

泛型java 代码讲解_Java泛型详解

2516326-5475e88a458a09e4.png一&#xff0c;打破砂锅问到底泛型存在的意义&#xff1f;泛型类&#xff0c;泛型接口&#xff0c;泛型方法如何定义&#xff1f;如何限定类型变量&#xff1f;泛型中使用的约束和局限性有哪些&#xff1f;泛型类型的继承规则是什么&#xff1f;泛…

(转)金额转中文大写

public class RMB {//返回转换好的大写形式public static String numberToRMB(String money) {return cleanZero(splitNum(roundString(money)));}// 将小写金额转换成大写金额private static String splitNum(String s) {// 如果传入的是空串则继续返回空串if ("".e…

[IOS]UIWebView实现保存页面和读取服务器端json数据

如何通过viewView保存访问过的页面&#xff1f;和如何获取并解析服务器端发送过来的json数据&#xff1f;通过一个简单的Demo来学习一下吧&#xff01; 操作步骤&#xff1a; 1.创建SingleViewApplication应用&#xff0c;新建VIewController&#xff0c;并在xib试图中添加WebV…

struts2之配置文件struts.xml详解

struts配置文件 struts.xml配置参数详解 struts.xml中很大一部分配置默认配置就好了 但是有些还是需要做了解 以便于理解 和修改 <?xml version"1.0" encoding"UTF-8"?> <!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Str…

ceph bluestore 源码分析:刷缓存(trim)逻辑

环境 ceph版本&#xff1a;12.2.1 部署模式&#xff1a;ec 21 osd&#xff1a; 3个 且资源池已经有数据 执行命令&#xff1a;ceph daemon osd.0 flush_store_cache 进行刷缓存。即将dump_mempools内存池管理的bluestore cache中的无用数据进行释放 主要参数: bluestore_cac…

php中怎么过滤器_PHP 过滤器(Filter)

过滤多个输入表单通常由多个输入字段组成。为了避免对 filter_var 或 filter_input 重复调用&#xff0c;我们可以使用 filter_var_array 或 the filter_input_array 函数。在本例中&#xff0c;我们使用 filter_input_array() 函数来过滤三个 GET 变量。接收到的 GET 变量是一…

c++ Qt向PHP接口POST文件流

Qt调用PHP写的接口&#xff0c;向其传递图片文件&#xff0c;并保存在服务器。 二进制文件无法直接传递&#xff0c;Qt采用Base64进行编码发送&#xff0c;PHP解码保存为文件。 注意&#xff1a;PHP收到数据之后会将POST过来的数据中的加号()替换为空格&#xff0c;造成接收到的…

在网络通讯中应用Protobuf

Protobuf的设计非常适用于在网络通讯中的数据载体&#xff0c;它序列化出来的数据量少再加上以K-V的方式来存储数据&#xff0c;对消息的版本兼容性非常强&#xff1b;还有一个比较大的优点就是有着很多的语言平台支持。下面讲解一下如何在TCP通讯应用中集成Protobuf. Protobuf…

JS中Math函数的常用方法

Math 是数学函数&#xff0c;但又属于对象数据类型 typeof Math > ‘object’ console.dir(Math) 查看Math的所有函数方法。 1&#xff0c;Math.abs() 获取绝对值 Math.abs(-12) 12 2&#xff0c;Math.ceil() and Math.floor() 向上取整和向下取整 console.log(Math.ceil(1…

C++ 泛型编程 -- 函数模版

文章目录定义声明调用方式函数模版的重载函数模版的特点工作中一个同事写了测试demo&#xff0c;想要自己尝试使用发现调用老出错&#xff0c;请教的时候发现是函数模版&#xff0c;有自己的调用方式&#xff0c;并且发现核心代码中大量的函数模版和类模版。特此做一个函数模版…

bellman_ford寻找平均权值最小的回路

给定一个有向图&#xff0c;如果存在平均值最小的回路&#xff0c;输出平均值。 使用二分法求解&#xff0c;对于一个猜测值mid&#xff0c;判断是否存在平均值小于mid的回路 如果存在平均值小于mid的包含k条边的回路&#xff0c;那么有w1w2w3...wk < k * mid,即(w1-mid)(w2…

守护进程中创建的对象php,在PHP中生成守护进程(Daemon Process)

前两天看到一篇文章《如何使用PHP编写daemon process》&#xff0c;其中对核心代码却没有细说&#xff0c;我又查了一些资料&#xff0c;还看了一本《理解Unix进程》&#xff0c;才搞明白生成守护进程的时候发生了什么。这段代码是这个样子的&#xff1a;function run(){//第一…

log4j个人使用整理

Log4j介绍&#xff1a; 略过。 配置&#xff1a; Eclipse项目中添加log4j.jar到lib下。 在bin目录下新建log4j.properties&#xff0c;编辑好log4j配置文件。 样例分析&#xff1a; 1 log4j.rootLoggerWARN, stdout, file2 log4j.appender.stdoutorg.apache.log4j.ConsoleAppen…

完全理解 Python 迭代对象、迭代器、生成器(转)

完全理解 Python 迭代对象、迭代器、生成器 本文源自RQ作者的一篇博文&#xff0c;原文是Iterables vs. Iterators vs. Generators nvie.com&#xff0c;俺写的这篇文章是按照自己的理解做的参考翻译&#xff0c;算不上是原文的中译版本&#xff0c;推荐阅读原文&#xff0c;谢…

Rocksdb 与 TitanDb 原理分析 及 性能对比测试

文章目录前言Rocksdb的compaction机制compaction作用compaction分类level style compaction&#xff08;rocksdb 默认进行的compaction策略&#xff09;level 的文件存储结构compaction过程compaction中的level target sizeuniversal style compactionfifo style compactionTit…

经典SQL练习题

题目地址&#xff1a;http://blog.csdn.net/qaz13177_58_/article/details/5575711 1、 查询Student表中的所有记录的Sname、Ssex和Class列。select sname,ssex,class from STUDENT2、 查询教师所有的单位即不重复的Depart列。select depart from TEACHER group by departselec…