sscanf,snprintf,sprintf小结

一、sprintf

sprint函数原型为 int sprintf(char *str, const char *format, ...)。作用是格式化字符串,具体功能如下所示:

(1)将数字变量转换为字符串。

(2)得到整型变量的16进制和8进制字符串。

(3)连接多个字符串。

举例如下

char str[256] = { 0 };

int data = 1024;

//将data转换为字符串

sprintf(str,"%d",data);

//获取data的十六进制

sprintf(str,"0x%X",data);

//获取data的八进制

sprintf(str,"0%o",data);

const char *s1 = "Hello";

const char *s2 = "World";

//连接字符串s1和s2

sprintf(str,"%s %s",s1,s2);

二、sscanf函数

    sscanf函数原型为int sscanf(const char *str, const char *format,
...)
。将参数str的字符串根据参数format字符串来转换并格式化数据,转换后的结果存于对应的参数内。具体功能如下:

(1)根据格式从字符串中提取数据。如从字符串中取出整数、浮点数和字符串等。

(2)取指定长度的字符串

(3)取到指定字符为止的字符串

(4)取仅包含指定字符集的字符串

(5)取到指定字符集为止的字符串

sscanf可以支持格式字符%[]:

(1)-:
表示范围,如:%[1-9]表示只读取1-9这几个数字 %[a-z]表示只读取a-z小写字母,类似地
%[A-Z]只读取大写字母

(2)^:
表示不取,如:%[^1]表示读取除‘1‘以外的所有字符 %[^/]表示除/以外的所有字符

(3),:
范围可以用","相连接如%[1-9,a-z]表示同时取1-9数字和a-z小写字母 

(4)原则:从第一个在指定范围内的数字开始读取,到第一个不在范围内的数字结束%s
可以看成%[]
的一个特例 %[^ ](注意^后面有一个空格!)

解析网址的例子如下所示:

const char *s = "http://www.baidu.com:1234";

char protocol[32] = { 0 };

char host[128] = { 0 };

char port[8] = { 0 };

sscanf(s,"%[^:]://%[^:]:%[1-9]",protocol,host,port);

printf("protocol: %s\n",protocol);

printf("host: %s\n",host);

printf("port: %s\n",port);

再比如说解析日历

char* s = “2015.08.14”;

int year, month, day;

sscanf(s, “%d.%d.%d”, &year, &month, &day);

可能还会看到%*[^;];%s,%*c之类的表达式。要注意的事加*表示丢弃的意思

比如说;

const char* s = “Deviceinfo=abcd;Connect=127.0.0.1;Port=6558;UserName=lql;Pwd=123”;

char szUrl[256] = {0};

char szIp[256]={0};

char szPort[256] = {0};

char szUserName[256] = {0};

char szPwd[256] = {0};

strcpy_s(szUrl, sizeof(szUrl) – 1, s);

sscanf(szUrl, “%*[^;];%s”, szUrl);//去掉Deviceinfo=abcd;

sscanf(szUrl, “Connect=%[^;]”, szIp);

sscanf(szUrl, “%*[^;];%s”, szUrl);//去掉Connect=…;

sscanf(szUrl, “Port=%[^;]”, szPort);

sscanf(szUrl, “%*[^;];%s”, szUrl);//去掉Port=…;

sscanf(szUrl, “UserName=%[^;]”, szUserName);

sscanf(szUrl, “%*[^;];%s”, szUrl);//去掉UserName=…;

sscanf(szUrl, “Pwd=%[^;]”, szPwd);

……

再比如说:

scanf(“%d %*c %d”, &a, &b);

如果输入1n2,因为会丢弃掉中间一个字符,所以最终结果是a=1,b=2

如果*放在[]里面就代表通配符了,意思什么字符都会输出的意思。

三、格式化函数对应的安全版本

sprintf  sprintf_s, sscanf sscanf_s等等。其实用法和上面说到的事一样的,就是多了一个缓冲区长度的参数。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-18 15:13:49

sscanf,snprintf,sprintf小结的相关文章

sscanf及sprintf

在程序中,我们肯定会遇到许多处理字符串的操作,当然C++中的string类已经做了很好了,但是也不要忘了C中的sscanf和sprintf 这两个函数用法跟printf和scanf用法很相似,只不过数据源和数据目的地从标准输入输出转换成了内存中的字符串. int sscanf ( const char * s, const char * format, ...); 1 /* sscanf example */ 2 #include <stdio.h> 3 4 int main () 5 { 6

sscanf和sprintf是scanf和printf家族用法 (转)

sscanf和sprintf是scanf和printf家族用法 sscanf和sprintf是scanf和printf家族的一对成员,用于处理和分析字符串非常强大得两个函数头文件 stdio.h原型int sscanf(const char *buffer,const char *format,...);int sprintf(char *buffer,const char *format,...);功能:类似于scanf和printf 但把字符串*buffer用于输入输出1.sprintf用于

C语言sscanf和sprintf输入输出使用及Strlen、Memset解释

sscanf() - 从一个字符串中读进与指定格式相符的数据. swscanf()- 用于处理宽字符字符串,和sscanf功能相同 通过学习和使用个人认为,在字符串格式不是很复杂,但是也并不简单的时候用这个函数比较合适,这个尺度就要靠自己把握了,字符串不是很复杂,但自己写个处理的函数比较麻烦,效率也不高,就用这个函数,如果字符串很复杂,那就用正则表达式吧. 不多说了,看看下面这些介绍和列子吧! 名称:sscanf() - 从一个字符串中读进与指定格式相符的数据. 函数原型: Int sscanf

函数sscanf()及sprintf()的简单讲解 --- NOJ 2015 PUMA

本次讲解将结合NOJ-2015和cplusplus.com的讲解进行, 题目链接如下: http://acm.njupt.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=2015 cplusplus的地址: http://www.cplusplus.com/ 从字面理解这两个函数的意思分别是从字符串读入和输出到字符串,即 Read formatted data from string 与 Write formatted data

C 标准库基础 IO 操作总结

其实输入与输出对于不管什么系统的设计都是异常重要的,比如设计 C 接口函数,首先要设计好输入参数.输出参数和返回值,接下来才能开始设计具体的实现过程.C 语言标准库提供的接口功能很有限,不像 Python 库.不过想把它用好也不容易,本文总结 C 标准库基础 IO 的常见操作和一些特别需要注意的问题,如果你觉着自己还不是大神,那么请相信我,读完全文后你肯定会有不少收获. 一.操作句柄 打开文件其实就是在操作系统中分配一些资源用于保存该文件的状态信息及文件的标识,以后用户程序可以用这个标识做各种读

C语言sprintf和sscanf函数用法

以前刚用C语言的时候,觉得字符串很难处理,后来用多了,发现其实并非如此,C语言也提供了许多函数给程序员使用.今天记录一下两个常用的两个字符串处理函数:sprintf和sscanf 1. sprintf 从名称上来看,这个函数名称由三部分组成: s 代表字符串(string) print 代表打印 f 代表格式化(format) 这样拆分,可以大概知道它是干嘛用的了,相对于我们常用的用来处理输出流的printf,sprintf是用来处理字符串的.实际上这个函数,是把数据按格式打印到字符串中,常用于

笔记整理--C语言

linux下错误的捕获:errno和strerror的使用 - Google Chrome (2014/2/26 17:31:39) linux下错误的捕获:errno和strerror的使用 2011-08-09 13:44:12 经常在调用linux 系统api 的时候会出现一些错误,比方说使用open() write() creat()之类的函数有些时候会返回-1,也就是调用失败,这个时候往往需要知道失败的原因.这个时候使用errno这个全局变量就相当有用了.    在程序代码中包含 #i

C/C++编程规范

1.注意:strncpy.strncat等带n版本的字符串操作函数在源字符串长度超出n标识的长度时,会将包括'\0'结束符在内的超长字符串截断,导致'\0'结束符丢失.这时需要手动为目标字符串设置'\0'结束符. char dst[11]; // [注意]最好每次定义时初始化为0: dst[11] = {0}; char src[] = "0123456789"; char *tmp = NULL; memset(dst, '@', sizeof(dst)); memcpy(dst,

PAT甲题题解-1108. Finding Average (20)-字符串处理

求给出数的平均数,当然有些是不符合格式的,要输出该数不是合法的. 这里我写了函数来判断是否符合题目要求的数字,有点麻烦. #include <iostream> #include <cstdio> #include <algorithm> #include <string.h> using namespace std; const int maxn=105; bool islegal(char*str){ int len=strlen(str); int p