热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

sscanf用法详解

sscanf()-从一个字符串中读进与指定格式相符的数据.函数原型:Intsscanf(stringstr,stringfmt,mixedvar1,mixedvar2);in
sscanf() - 从一个字符串中读进与指定格式相符的数据. 
  函数原型: 
  Int sscanf( string str, string fmt, mixed var1, mixed var2 ... ); 
  int scanf( const char *format [,argument]... ); 
  说明: 
  sscanf与scanf类似,都是用于输入的,只是后者以屏幕(stdin)为输入源,前者以固定字符串为输入源。 
  其中的format可以是一个或多个 {%[*] [width] [{h | l | I64 | L}]type | ' ' | '\t' | '\n' | 非%符号} 
  注: 
  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的任意字符,贪婪性 


例子: 
  1. 常见用法。 
  char buf[512] = ; 
  sscanf("123456 ", "%s", buf); 
  printf("%s\n", 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 
  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。(注意:“,”之后有一空格) 
  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); 

/*****************************************************
** Name : sscanf.c
** Author : gzshun
** Version : 1.0
** Date : 2011-12
** Description : sscanf function
******************************************************/
#include
#include
#include static void sscanf_test(void);static void sscanf_test(void)
{int ret;char *string;int digit;char buf1[255];char buf2[255];char buf3[255];char buf4[255];/*1.最简单的用法*/string &#61; "china beijing 123";ret &#61; sscanf(string, "%s %s %d", buf1, buf2, &digit);printf("1.string&#61;%s\n", string);printf("1.ret&#61;%d, buf1&#61;%s, buf2&#61;%s, digit&#61;%d\n\n", ret, buf1, buf2, digit);/***执行结果:**1.ret&#61;3, buf1&#61;china, buf2&#61;beijing, digit&#61;123**可以看出,sscanf的返回值是读取的参数个数*//*2.取指定长度的字符串*/string &#61; "123456789";sscanf(string, "%5s", buf1);printf("2.string&#61;%s\n", string);printf("2.buf1&#61;%s\n\n", buf1);/***执行结果:**2.buf1&#61;12345*//*3.取到指定字符为止的字符串*/string &#61; "123/456";sscanf(string, "%[^/]", buf1);printf("3.string&#61;%s\n", string);printf("3.buf1&#61;%s\n\n", buf1);/***执行结果:**3.buf1&#61;123*//*4.取到指定字符集为止的字符串*/string &#61; "123abcABC";sscanf(string, "%[^A-Z]", buf1);printf("4.string&#61;%s\n", string);printf("4.buf1&#61;%s\n\n", buf1);/***执行结果:**4.buf1&#61;123abc*//*5.取仅包含指定字符集的字符串*/string &#61; "0123abcABC";sscanf(string, "%[0-9]%[a-z]%[A-Z]", buf1, buf2, buf3);printf("5.string&#61;%s\n", string);printf("5.buf1&#61;%s, buf2&#61;%s, buf3&#61;%s\n\n", buf1, buf2, buf3);/***执行结果:**5.buf1&#61;123, buf2&#61;abc, buf3&#61;ABC*//*6.获取指定字符中间的字符串*/string &#61; "ioswp7";sscanf(string, "%*[^<]<%[^>]", buf1);printf("6.string&#61;%s\n", string);printf("6.buf1&#61;%s\n\n", buf1);/***执行结果:**6.buf1&#61;android*//*7.指定要跳过的字符串*/string &#61; "iosVSandroid";sscanf(string, "%[a-z]VS%[a-z]", buf1, buf2);printf("7.string&#61;%s\n", string);printf("7.buf1&#61;%s, buf2&#61;%s\n\n", buf1, buf2);/***执行结果:**7.buf1&#61;ios, buf2&#61;android*//*8.分割以某字符隔开的字符串*/string &#61; "android-iphone-wp7";/***字符串取道&#39;-&#39;为止,后面还需要跟着分隔符&#39;-&#39;,**起到过滤作用,有点类似于第7点*/sscanf(string, "%[^-]-%[^-]-%[^-]", buf1, buf2, buf3);printf("8.string&#61;%s\n", string);printf("8.buf1&#61;%s, buf2&#61;%s, buf3&#61;%s\n\n", buf1, buf2, buf3);/***执行结果:**8.buf1&#61;android, buf2&#61;iphone, buf3&#61;wp7*//*9.提取邮箱地址*/string &#61; "Email:beijing&#64;sina.com.cn";sscanf(string, "%[^:]:%[^&#64;]&#64;%[^.].%s", buf1, buf2, buf3, buf4);printf("9.string&#61;%s\n", string);printf("9.buf1&#61;%s, buf2&#61;%s, buf3&#61;%s, buf4&#61;%s\n\n", buf1, buf2, buf3, buf4);/***执行结果:**9.buf1&#61;Email, buf2&#61;beijing, buf3&#61;sina, buf4&#61;com.cn*//*10.过滤掉不想截取或不需要的字符串--补充,**在%号后面加一*号,代表过滤这个字符串,不读取*/string &#61; "android iphone wp7";sscanf(string, "%s %*s %s", buf1, buf2);printf("10.string&#61;%s\n", string);printf("10.buf1&#61;%s, buf2&#61;%s\n\n", buf1, buf2);/***执行结果:**10.android wp7*/
}int main(int argc, char **argv)
{sscanf_test();return 0;
}/*
**测试程序
**环境:
**Linux ubuntu 2.6.32-24-generic-pae #39-Ubuntu SMP Wed Jul 28 07:39:26 UTC 2010 i686 GNU/Linux
**gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5)
**
gzshun&#64;ubuntu:~/c/sscanf$ gcc sscanf.c -o sscanf
gzshun&#64;ubuntu:~/c/sscanf$ ./sscanf
1.string&#61;china beijing 123
1.ret&#61;3, buf1&#61;china, buf2&#61;beijing, digit&#61;1232.string&#61;123456789
2.buf1&#61;123453.string&#61;123/456
3.buf1&#61;1234.string&#61;123abcABC
4.buf1&#61;123abc5.string&#61;0123abcABC
5.buf1&#61;0123, buf2&#61;abc, buf3&#61;ABC6.string&#61;ioswp7
6.buf1&#61;android7.string&#61;iosVSandroid
7.buf1&#61;ios, buf2&#61;android8.string&#61;android-iphone-wp7
8.buf1&#61;android, buf2&#61;iphone, buf3&#61;wp79.string&#61;Email:beijing&#64;sina.com.cn
9.buf1&#61;Email, buf2&#61;beijing, buf3&#61;sina, buf4&#61;com.cn10.string&#61;android iphone wp7
10.buf1&#61;android, buf2&#61;wp7
*/







推荐阅读
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 获取时间的函数js代码,js获取时区代码
    本文目录一览:1、js获取服务器时间(动态)2 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 本文介绍了一种划分和计数油田地块的方法。根据给定的条件,通过遍历和DFS算法,将符合条件的地块标记为不符合条件的地块,并进行计数。同时,还介绍了如何判断点是否在给定范围内的方法。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 本文介绍了UVALive6575题目Odd and Even Zeroes的解法,使用了数位dp和找规律的方法。阶乘的定义和性质被介绍,并给出了一些例子。其中,部分阶乘的尾零个数为奇数,部分为偶数。 ... [详细]
  • 从零学Java(10)之方法详解,喷打野你真的没我6!
    本文介绍了从零学Java系列中的第10篇文章,详解了Java中的方法。同时讨论了打野过程中喷打野的影响,以及金色打野刀对经济的增加和线上队友经济的影响。指出喷打野会导致线上经济的消减和影响队伍的团结。 ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • 语义分割系列3SegNet(pytorch实现)
    SegNet手稿最早是在2015年12月投出,和FCN属于同时期作品。稍晚于FCN,既然属于后来者,又是与FCN同属于语义分割网络 ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
  • 安卓select模态框样式改变_微软Office风格的多端(Web、安卓、iOS)组件库——Fabric UI...
    介绍FabricUI是微软开源的一套Office风格的多端组件库,共有三套针对性的组件,分别适用于web、android以及iOS,Fab ... [详细]
author-avatar
十点半的
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有