[String]sscanf()的用法和例子

2024-02-27 23:48
文章标签 string 用法 例子 sscanf

本文主要是介绍[String]sscanf()的用法和例子,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

转载自:http://www.cnblogs.com/gmh915/archive/2009/09/30/1576995.html

这里有些sscanf()的一些使用说明,都是从论坛,Blog里整理出来的。供大家使用。 
    通过学习和使用个人认为,在字符串格式不是很复杂,但是也并不简单的时候用这个函数比较合适,这个尺度就要靠自己把握了,字符串不是很复杂,但自己写个处理的函数比较麻烦,效率也不高,就用这个函数,如果字符串很复杂,那就用正则表达式吧。 
不多说了,看看下面这些介绍和列子吧!
名称: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' | 非%符号}
支持集合操作: 
        %[a-z] 表示匹配a到z中任意字符,贪婪性(尽可能多的匹配) 
        %[aB'] 匹配a、B、'中一员,贪婪性 
        %[^a] 匹配非a的任意字符,贪婪性
例子: 
1. 常见用法。 
      charbuf[512] = {0}; 
      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。 
8、 
char *s="1try234delete5" 
则: 
sscanf(s, "1%[^2]234%[^5]", s1, s2); 
scanf的format中出现的非转换字符(%之前或转换字符之后的字符),即此例中的1234用来跳过输入中的相应字符; 
‘[]’的含义与正则表达式中相同,表示匹配其中出现的字符序列;^表示相反。使用[]时接收输入的变量必须是有足够存储空间的char、signed char、unsignedchar数组。记住[也是转换字符,所以没有s了。
8、分割以某字符标记的字符串。
chartest[]="222,333,444,,,555,666"; 
chars1[4],s2[4],s3[4],s4[4],s5[4],s6[4],s7[4]; 
sscanf(test,"%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,]",s1,s2,s3,s4,s5,s6,s7); 
printf("sssa1=%s",s1); 
printf("sssa2=%s",s2); 
printf("sssa3=%s",s3); 
printf("sssa4=%s",s4); 
printf("sssa5=%s",s5); 
printf("sssa6=%s",s6); 
printf("sssa7=%s",s7); 
9、一个提取用户个人资料中邮件地址的例子 
#include 
#include 
using namespace std; 
int main() 

      chara[20]={0}; 
      charb[20]={0}; 
      //假设email地址信息以';'结束 
      sscanf("email:jimmywhr@gmail.com;","%*[^:]:%[^;]",a); 
      //假设email地址信息没有特定的结束标志 
      sscanf("email:jimmywhr@gmail.com","%*[^:]:%s",b); 
      printf("%s\n",a); 
      printf("%s\n",b); 
      system("pause"); 
      return0; 

关键是"%*[^:]:%[^;]"和"%*[^:]:%s"这两个参数的问题 
%*[^:]      表示满足"[]"里的条件将被过滤掉,不会向目标参数中写入值。这里的意思是在 
                      第一个':'之前的字符会在写入时过滤掉,'^'是表示否定的意思,整个参数翻译 
                      成白话就是:将在遇到第一个':'之前的(不为':'的)字符全部过滤掉。 
              自然就是跳过':'的意思。 
%[^;]        拷贝字符直到遇到';'。
一下摘自: http://blog.csdn.net/lbird/archive/2007/08/03/1724429.aspx 
%[ ] 的用法:%[ ]表示要读入一个字符集合, 如果[ 后面第一个字符是”^”,则表示反意思。
                                      [ ]内的字符串可以是1或更多字符组成。空字符集(%[])是违反规定的,可
                                      导致不可预知的结果。%[^]也是违反规定的。 
                 
%[a-z] 读取在 a-z之间的字符串,如果不在此之前则停止,如
                        char s[]="hello, my friend”;                // 注意: ,逗号在不 a-z之间
                        sscanf( s, “%[a-z]”, string ) ; // string=hello

%[^a-z] 读取不在 a-z 之间的字符串,如果碰到a-z之间的字符则停止,如
                        char s[]="HELLOkitty”;                // 注意: ,逗号在不 a-z之间
                        sscanf( s, “%[^a-z]”, string ) ; // string=HELLO

%*[^=]      前面带 *号表示不保存变量。跳过符合条件的字符串。
                        char s[]="notepad=1.0.0.1001" ;
          char szfilename [32] = "" ;
          int i = sscanf( s, "%*[^=]", szfilename ) ; //szfilename=NULL,因为没保存
int i = sscanf( s,"%*[^=]=%s", szfilename ) ; // szfilename=1.0.0.1001
@c          读取40个字符
          The run-time
library does notautomatically append a null terminator
to the string, nor doesreading 40 characters
automatically terminate thescanf() function. Because the
library uses bufferedinput, you must press the ENTER key
to terminate the stringscan. If you press the ENTER before
the scanf() reads 40characters, it is displayed normally,
and the library continuesto prompt for additional input
until it reads 40characters

%[^=]        读取字符串直到碰到’=’号,’^’后面可以带更多字符,如:
                        char s[]="notepad=1.0.0.1001" ;
          char szfilename [32] = "" ;
          int i = sscanf( s, "%[^=]", szfilename ) ; //szfilename=notepad         
          如果参数格式是:%[^=:] ,那么也可以从 notepad:1.0.0.1001读取notepad
                       
使用例子:
chars[]="notepad=1.0.0.1001" ;
char szname [32] = "";
char szver [32] = “”;
sscanf( s, "%[^=]=%s",szname , szver ) ; // szname=notepad, szver=1.0.0.1001
总结:%[]有很大的功能,但是并不是很常用到,主要因为:
1、许多系统的 scanf 函数都有漏洞.(典型的就是 TC 在输入浮点型时有时会出错).
2、用法复杂, 容易出错.
3、编译器作语法分析时会很困难,从而影响目标代码的质量和执行效率.
个人觉得第3点最致命,越复杂的功能往往执行效率越低下。而一些简单的字符串分析我们可以自已处理。

这篇关于[String]sscanf()的用法和例子的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/753913

相关文章

Python中logging模块用法示例总结

《Python中logging模块用法示例总结》在Python中logging模块是一个强大的日志记录工具,它允许用户将程序运行期间产生的日志信息输出到控制台或者写入到文件中,:本文主要介绍Pyt... 目录前言一. 基本使用1. 五种日志等级2.  设置报告等级3. 自定义格式4. C语言风格的格式化方法

SpringBoot 获取请求参数的常用注解及用法

《SpringBoot获取请求参数的常用注解及用法》SpringBoot通过@RequestParam、@PathVariable等注解支持从HTTP请求中获取参数,涵盖查询、路径、请求体、头、C... 目录SpringBoot 提供了多种注解来方便地从 HTTP 请求中获取参数以下是主要的注解及其用法:1

Java中HashMap的用法详细介绍

《Java中HashMap的用法详细介绍》JavaHashMap是一种高效的数据结构,用于存储键值对,它是基于哈希表实现的,提供快速的插入、删除和查找操作,:本文主要介绍Java中HashMap... 目录一.HashMap1.基本概念2.底层数据结构:3.HashCode和equals方法为什么重写Has

Android协程高级用法大全

《Android协程高级用法大全》这篇文章给大家介绍Android协程高级用法大全,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友跟随小编一起学习吧... 目录1️⃣ 协程作用域(CoroutineScope)与生命周期绑定Activity/Fragment 中手

Python异步编程之await与asyncio基本用法详解

《Python异步编程之await与asyncio基本用法详解》在Python中,await和asyncio是异步编程的核心工具,用于高效处理I/O密集型任务(如网络请求、文件读写、数据库操作等),接... 目录一、核心概念二、使用场景三、基本用法1. 定义协程2. 运行协程3. 并发执行多个任务四、关键

C++ STL-string类底层实现过程

《C++STL-string类底层实现过程》本文实现了一个简易的string类,涵盖动态数组存储、深拷贝机制、迭代器支持、容量调整、字符串修改、运算符重载等功能,模拟标准string核心特性,重点强... 目录实现框架一、默认成员函数1.默认构造函数2.构造函数3.拷贝构造函数(重点)4.赋值运算符重载函数

Python中yield的用法和实际应用示例

《Python中yield的用法和实际应用示例》在Python中,yield关键字主要用于生成器函数(generatorfunctions)中,其目的是使函数能够像迭代器一样工作,即可以被遍历,但不会... 目录python中yield的用法详解一、引言二、yield的基本用法1、yield与生成器2、yi

深度解析Python yfinance的核心功能和高级用法

《深度解析Pythonyfinance的核心功能和高级用法》yfinance是一个功能强大且易于使用的Python库,用于从YahooFinance获取金融数据,本教程将深入探讨yfinance的核... 目录yfinance 深度解析教程 (python)1. 简介与安装1.1 什么是 yfinance?

redis数据结构之String详解

《redis数据结构之String详解》Redis以String为基础类型,因C字符串效率低、非二进制安全等问题,采用SDS动态字符串实现高效存储,通过RedisObject封装,支持多种编码方式(如... 目录一、为什么Redis选String作为基础类型?二、SDS底层数据结构三、RedisObject

Python库 Django 的简介、安装、用法入门教程

《Python库Django的简介、安装、用法入门教程》Django是Python最流行的Web框架之一,它帮助开发者快速、高效地构建功能强大的Web应用程序,接下来我们将从简介、安装到用法详解,... 目录一、Django 简介 二、Django 的安装教程 1. 创建虚拟环境2. 安装Django三、创