sscanf函数实现,sscanf_s函数的用法
c++中sscanf函数与sprintf函数的用法
一.sscanf 读取格式化的字符串中的数据
sscanf和scanf类似,都是用于输入的,只是后者以屏幕为输入源,而前者以固定字符串为输入。
sscanf() 是从一个字符串中读进与指定格式相符的数据
二.sprintf与printf的用法很类似,只不过是前者输出到指定的目标,后者输出到屏幕。
sprintf()指的是字符串格式化命令,主要功能是把格式化的数据写入某个字符串中。
int scanf(const char format [,agument])
其中format可以是一个或多个
{%[ ][width][{h | l | l64 | L}]}type
{a|b|c}表示a、b、c中选一,[d]表示d是可有可无的。
所以,format形式可以有:
%s
%5s
%[a-z]5d
注意:
%*[width][{h | l | l64 | L}]}type表示过滤满足条件的字符串,不向目标中输出。
1、基本用法,取字符串
string source0 = "1234456";
char str[521];
sscanf(source0.c_str(),"%s",str);
sscanf(source0.c_str(),"%4s",str);
2、转换为整型数
string source0 = "123456";
int x;
sscanf(source0.c_str(),"%d",x);
sscanf(source0.c_str(),"%3d",x);
3、停止和范围
sscanf(source0,"%[^a]",str); //遇到“a”停止
sscanf(source0,"%[^c]",str); //遇到“c”停止
sscanf(source0,"%[1-9A-Z]",str); //只取范围1-9和A-Z的字符
sscanf(source0,"%[^b-z]",str); //遇到“b-z”停止
sscanf(source0,"%[^c-z]",str); //遇到“c-z”停止
4、格式转换
char source[512] = "2015:8:1";
int a,b,c;
sscanf(source,"%d:%d:%d",a,b,c);
注意:这个地方a、b、c必须加引用,否则会报错。
5、复杂情况
char source[512] = "fjkdsjf/123456@fjkdsjf";
char str[512];
sscanf(source,"%*[ /]/%[ @]",str);
结果为:123456
sprintf
sprintf与printf的用法很类似,只不过是前者输出到指定的目标,后者输出到屏幕。
int sprintf(char *buffer,const char *format,...)
举个例子:
结果:
1
buf = 1
buf = 00000001
2
buf = 2
buf = 00000002
怎么利用sscanf() 读取字符窜中的整数 VC++?
sscanf()函数用于从字符串中读取指定格式的数据,其原型如下:
int sscanf (char *str, char * format [, argument, ...]);
【参数】参数str为要读取数据的字符串;format为用户指定的格式;argument为变量,用来保存读取到的数据。
【返回值】成功则返回参数数目,失败则返回-1,错误原因存于errno 中。
sscanf()会将参数str 的字符串根据参数format(格式化字符串)来转换并格式化数据(格式化字符串请参考scanf()), 转换后的结果存于对应的变量中。
sscanf()与scanf()类似,都是用于输入的,只是scanf()以键盘(stdin)为输入源,sscanf()以固定字符串为输入源。
【实例】从指定的字符串中读取整数和小写字母。#include stdio.hint main(void){ char str[100] ="123568qwerSDDAE"; char lowercase[100]; int num; sscanf(str,"%d %[a-z]", num, lowercase); printf("The number is: %d.\n", num); printf("The lowercase is: %s.", lowercase); return 0;}
输出结果:
The number is: 123568.
The lowercase is: qwer.
可以看到format参数有些类似正则表达式(当然没有正则表达式强大,复杂字符串建议使用正则表达式处理),支持集合操作,例如:
%[a-z] 表示匹配a到z中任意字符,贪婪性(尽可能多的匹配)
%[aB'] 匹配a、B、'中一员,贪婪性
%[^a] 匹配非a的任意字符,贪婪性
另外,format不仅可以用空格界定字符串,还可以用其他字符界定,可以实现简单的字符串分割(更加灵活的字符串分割请使用strtok())。例如:
sscanf("2006:03:18", "%d:%d:%d", a, b, c);
sscanf("2006:03:18 - 2006:04:18", "%s - %s", sztime1, sztime2);
sscanf()如何实现?
sscanf与scanf类似,都是用于输入的,只是后者以键盘(stdin)为输入源,前者以固定字符串为输入源。
举个例子给你看:
char* pQueryStr=getenv("QUERY_STRING");
char pName[256];
sscanf(pQueryStr,"name=%s",pName);
printf("Hello %s!\n",pName);
最后显示出来的就是:Hello tom!