c++中sscanf的用法

2023-05-16

sscanf 读取格式化的字符串中的数据。

swscanf 是 sscanf 的宽字符版本;swscanf 的参数是宽字符串。 swscanf不处理 Unicode 全角十六进制或"兼容性区"字符。 除此以外,swscanf 和 sscanf 的行为完全相同。

函数语法

1

int sscanf(     const char *buffer,     const char *format, [ argument ] ...   ); 

参数

buffer
  存储的数据

format
  窗体控件字符串。 有关详细信息,请参阅"格式规范"。

argument
  可选自变量

locale
  要使用的区域设置 

要求

例程必须的头文件
sscanf

<stdio.h>

_sscanf_l
swscanf

<stdio.h>

<wchar.h>

_swscanf_l

说明

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

第二个参数可以是一个或多个 {%[*] [width] [{h | I | 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 表示满足该条件的被过滤掉,不会向目标参数中写入值

失败返回0 ,否则返回格式化的参数个数

7、如果读取的字符串,不是以空格来分隔的话,就可以使用%[]。

返回值

函数将返回成功赋值的字段个数;返回值不包括已读取但未赋值的字段个数。 返回值为 0 表示没有将任何字段赋值。 如果在第一次读取之前到达字符串结尾,则返回EOF。

如果buffer或format是NULL调用指针,无效参数处理程序,如中所述参数验证。 如果允许继续执行,则这些函数返回 -1 并将errno设置为EINVAL。

成功则返回参数数目,失败则返回-1,错误原因存于errno中。

经多次测试[来源请求],在linux系统中成功返回的是成功转换的值的个数,例如:

sscanf("1 2 3","%d %d %d",buf1, buf2, buf3); 成功调用返回值为3,即buf1,buf2,buf3均成功转换。

sscanf("1 2","%d %d %d",buf1, buf2, buf3); 成功调用返回值为2,即只有buf1,buf2成功转换。

(注意:此处buf均为地址)

有关这些和其他错误代码的信息,请参阅_doserrno、 errno、 _sys_errlist 和 _sys_nerr。 

作用

读取格式化的字符串中的数据。

P.S. 这些函数的更安全版本才会有效。请参阅sscanf_s、 _sscanf_s_l、 swscanf_s、 _swscanf_s_l。 

使用实例

1、一般用法

1

2

3

char buf[512] = ;

sscanf("123456 ""%s", buf);

printf("%s\n", buf);

结果为:123456
  2. 取指定长度的字符串。如在下例中,取最大长度为4字节的字符串。

1

2

sscanf("123456 ""%4s", buf);

printf("%s\n", buf);

结果为:1234
  3. 取到指定字符为止的字符串。如在下例中,取遇到空格为止字符串。

1

2

sscanf("123456 abcdedf""%[^ ]", buf);

printf("%s\n", buf);

结果为:123456
  4. 取仅包含指定字符集的字符串。如在下例中,取仅包含1到9和小写字母的字符串。

1

2

sscanf("123456abcdedfBCDEF""%[1-9a-z]", buf);

printf("%s\n", buf);

结果为:123456abcdedf
  5. 取到指定字符集为止的字符串。如在下例中,取遇到大写字母为止的字符串。

1

2

sscanf("123456abcdedfBCDEF""%[^A-Z]", buf);

printf("%s\n", buf);

结果为:123456abcdedf
  6、给定一个字符串iios/12DDWDFF@122,获取 / 和 @ 之间的字符串,先将 "iios/"过滤掉,再将非'@'的一串内容送到buf中

1

2

sscanf("iios/12DDWDFF@122""%*[^/]/%[^@]", buf);

printf("%s\n", buf);

结果为:12DDWDFF
  7、给定一个字符串"hello, world",仅保留"world"。(注意:“,”之后有一空格)

1

2

sscanf("hello, world""%*s%s", buf);

printf("%s\n", buf);

结果为:world
  P.S. %*s表示第一个匹配到的%s被过滤掉,即hello被过滤了,
  如果没有空格则结果为NULL。 

例程

代码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

//Compiled with Visual Studio 2015.

//================Original File===================*/

// crt_sscanf.c  

// compile with: /W3  

// This program uses sscanf to read data items  

// from a string named tokenstring, then displays them.    #

include <stdio.h>    

int main( void )  {

     char  tokenstring[] = "15 12 14...";

     char  s[81];

     char  c;

     int   i;

     float fp;

       // Input various data from tokenstring:

     // max 80 character string:

     sscanf( tokenstring, "%80s", s ); // C4996

     sscanf( tokenstring, "%c", &c );  // C4996

     sscanf( tokenstring, "%d", &i );  // C4996

     sscanf( tokenstring, "%f", &fp ); // C4996

     // Note: sscanf is deprecated; consider using sscanf_s instead 

      // Output the data read

     printf"String    = %s\n", s );

     printf"Character = %c\n", c );

     printf"Integer:  = %d\n", i );

     printf"Real:     = %f\n", fp );

  }  

输出

1

String    = 15  Character = 1  Integer:  = 15  Real:     = 15.000000  

集合操作

%[a-z] 表示匹配a到z中任意字符,贪婪性(尽可能多的匹配)

%[aB'] 匹配a、B、'中一员,贪婪性

%[^a] 匹配非a的任意字符,并且停止读入,贪婪性

小结

sscanf的功能很类似于正则表达式, 但却没有正则表达式强大,所以如果对于比较复杂的字符串处理,建议使用正则表达式。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c++中sscanf的用法 的相关文章

  • android SQLiteOpenHelper 使用

    1 实体 package mydemo mycom demo2 entity public class UserInfo private int id private String username private String passw
  • SQLiteOpenHelper的简单使用

    由于想学习GreenDao框架 xff0c 但是看了一下有的蒙圈 xff0c 所以先熟悉一下android原生的SQLiteOpenHelper的使用 工具 xff1a SQLite Expert Personal SQLite Exper
  • 安卓案例:利用SQLiteOpenHelper操作数据库及表

    安卓案例 xff1a 利用SQLiteOpenHelper操作数据库及表 一 运行效果 二 涉及知识点 1 利用SQLiteOpenHelper类创建与升级数据库 这个类是一个抽象类 xff0c 我们必须继承该类创建一个子类 xff0c 实
  • delphi SimpleGraph控件的部分注释

    TSimpleGraph是一个delphi下的可视化图形开源控件 xff0c 有很强编辑态和运行态编辑功能 是学习开发DELPHI控件的一个很好的例子 控件本身有很强的扩展性 完全可以自定义绘制各种图形 控件的地址为http www del
  • java获取实体类的属性和值

    package com jackie day11 import java lang reflect Field import java lang reflect InvocationTargetException import java l
  • Android USB 开发详解

    Android USB 开发详解 先附上 Android USB 官方文档 Android通过两种模式支持各种 USB 外设和 Android USB 附件 xff08 实现Android附件协议的硬件 xff09 xff1a USB附件和
  • Android USB串口开发

    因为第一次接触Android下的串口开发 xff0c 在网上找了很多例子都不能满足自己的需要以及不能正常使用 xff0c 于是结合网上的资源以及查阅资料 xff0c 终于完成了关于这个串口的开发 xff0c 在此记录下usb转串口通信开发的
  • Android USB转串口通信开发实例详解

    好久没有写文章了 xff0c 年前公司新开了一个项目 xff0c 是和usb转串口通信相关的 xff0c 需求是用安卓平板通过usb转接后与好几个外设进行通信 xff0c 一直忙到最近 xff0c 才慢慢闲下来 xff0c 趁着这个周末不忙
  • Android USB转串口编程

    安卓手机的对外通信接口就只有USB跟音频口 xff0c 我们可采用其进行与外设进行通信 今天 xff0c 我们来讲讲安卓手机利用USB接口与外设进行通信 此时 xff0c 有两种情况 第一 xff1a USB xff08 手机 xff09
  • Android串口编程--开关灯Demo(附源码)

    1 项目简述 第二次玩硬件了 xff0c 第一次是通过局域网控制门的开关 xff0c 这次是通过ZB xff08 大概就是这么叫 xff0c 具体名字不清楚 xff09 控制灯的开关 xff0c 感觉控制硬件也就是给硬件发个byte数组而已
  • 安卓开发中的USB转串口通讯

    安卓开发中的USB转串口通讯 本文使用GitHub上开源的 hoho android usbserial USB串口库 该库基于 Android USB Host API xff0c 驱动完全由java开发 xff0c 无需root xff
  • Android USB转串口开发(hoho.android.usbserial串口库)

    使用hoho android usbserial串口库开发串口 import android app Application import android app PendingIntent import android content B
  • 安卓数据库开发helper

    package com mytest myapplication public class MyInfo public MyInfo int id String name String value ID 61 id Name 61 name
  • Android 在布局容器中动态添加控件

    这里 xff0c 通过一个小demo xff0c 就可以掌握在布局容器中动态添加控件 xff0c 以动态添加Button控件为例 xff0c 添加其他控件同样道理 1 addView 添加控件到布局容器 2 removeView 在布局容器
  • delphi offsetof , container_of 通过结构体成员获得到该结构体地址

    C宏 offsetof type member 该结构体成员相对于该结构体的偏移量 define offsetof TYPE MEMBER size t amp TYPE 0 gt MEMBER 那Delphi版的表示式怎么写呢 Nativ
  • Android 动态添加Button(1)

    这是一个非常简单的动态添加Button的例子 xff1a package com kkkk llll import android app Activity import android os Bundle import android w
  • 将一串随机数输入到二维坐标轴中,不断刷新JPanel,实现动态显示的效果微笑

    将一串随机数输入到二维坐标轴中 xff0c 不断刷新JPanel 实现动态显示的效果 import java awt BasicStroke import java awt BorderLayout import java awt Colo
  • onDraw什么时候被调用?

    1 onDraw是在View初化完成之后开始调用 2 postInvalidate 是重绘的 xff0c 也就是调用postInvalidate 后系统会重新调用onDraw方法画一次 onDraw实例 xff1a Java code 64

随机推荐

  • Android 动态绘制曲线等各种图形

    Android 中动态的绘制有两种方法 xff0c 一种是用OpenGL ES xff0c 它主要用来做3D图形开发 xff0c 对于一般的应用 xff0c 我们会采取自定义一个View xff0c 然后覆盖onDraw 的方法 xff0c
  • Android 曲线图绘制

    最近项目里要做一个简单的曲线图来标识数据 xff0c 开始以为很简单 xff0c android已经有那么多的开源图表库了 xff0c 什么achartenginee hellochart xff0c mpandroidchart等等 xf
  • android中在代码中动态布按钮和画板局并绘制曲线

    strong 绘图面板基类继承View strong package com mytest myapplication Utility import android graphics Color import android util Lo
  • html5 div布局与table布局

    div布局 xff1a html 43 css实现简单布局 container中height不能写成百分数 xff0c 必须为具体高度 lt DOCTYPE html gt lt html gt lt head lang 61 34 en
  • andorid程序UI线程下开启子线程闪退错误解决

    android view ViewRootImpl CalledFromWrongThreadException Only the original 运行时报 android view ViewRootImpl CalledFromWron
  • Android子线程更新UI的方法总结

    消息机制 xff0c 对于Android开发者来说 xff0c 应该是非常熟悉 对于处理有着大量交互的场景 xff0c 采用消息机制 xff0c 是再好不过了 有些特殊的场景 xff0c 比如我们都知道 xff0c 在Android开发中
  • android中多线程绘制曲线图实例

    画板基类继承view package com mytest myapplication Utility import android graphics Color import android util Log import android
  • InterlockedCompareExchangePointer 的作用和例子

    PVOID InterlockedCompareExchangePointer in out PVOID volatile Destination in PVOID Exchange in PVOID Comperand Interlock
  • java读取xml文件的四种方法

    Xml代码 1 lt xml version 61 34 1 0 34 encoding 61 34 GB2312 34 gt 2 lt RESULT gt 3 lt VALUE gt 4 lt NO gt A1234 lt NO gt 5
  • Android多线程之同步锁的使用

    本文主要介绍了Android多线程之同步锁的使用 xff0c 分享给大家 xff0c 具体如下 xff1a 一 同步机制关键字synchronized 对于Java来说 xff0c 最常用的同步机制就是synchronized关键字 xff
  • C#使用 System.Net.Mail发送邮件功能

    C 使用 System Net Mail发送邮件功能 NET 里包含了很多很丰富的邮件发送与接受的API在 System Net Mail命名空间里 xff0c 使得我们开发发送和接受邮件相关功能变得简单 xff0c 下面是一个简单发送邮件
  • C#SMTP发邮件

    简单邮件传输协议 Simple Mail Transfer Protocol SMTP 是事实上的在Internet传输email的标准 C 邮件传输主要用到了 SmtpClient 和MailMessage 类 SmtpClient类是客
  • C#发送邮件实例

    using System using System Collections Generic using System ComponentModel using System Data using System Drawing using S
  • closehandle()函数

    引用自 百度百科 xff0c 用于解决今天遇到的close handle 后什么时候释放资源问题 xff1a 方法名称 xff1a CloseHandle 位置 xff1a Kernel32 dll BOOL CloseHandle HAN
  • c++清空串口缓冲区

    缓冲区控制 Win32通信API除了提供SetupComm 函数实现初始化的缓冲区控制外 xff0c 还提供了PurgeComm 函数和FlushFileBuffers 函数来进行缓冲区操作 PurgeComm 函数的声明如下 xff1a
  • C++ int与string的转化

    int本身也要用一串字符表示 xff0c 前后没有双引号 xff0c 告诉编译器把它当作一个数解释 缺省情况下 xff0c 是当成10进制 xff08 dec xff09 来解释 xff0c 如果想用8进制 xff0c 16进制 xff0c
  • c++中字符数组内存和指针问题示例解答

    char id 61 34 123456 34 char c 61 34 SN 61 34 unsigned char buffer 20 int j 61 0 for int i 61 0 i lt strlen c i 43 43 bu
  • c++中LPCTSTR,LPTSTR 解释

    char是C语言标准数据类型 xff0c 字符型 xff0c 至于由几个字节组成通常由编译器决定 xff0c 一般一个字节 Windows为了消除各编译器的差别 xff0c 重新定义了一些数据类型 xff0c 你提到了另外几个类型都是这样
  • Delphi 自定义事件的例子

    我们这个控件将演示控件的自定义事件的书写 这个控件有一个类型为string的SensitiveText属性 xff0c 当用户在输入框中输入的文字为InvalidText时就会触发OnSensitiveText事件 按照惯例 xff0c 我
  • c++中sscanf的用法

    sscanf 读取格式化的字符串中的数据 swscanf 是 sscanf 的宽字符版本 xff1b swscanf 的参数是宽字符串 swscanf不处理 Unicode 全角十六进制或 34 兼容性区 34 字符 除此以外 xff0c