sscanf,sscanf_s及其相关用法

合集下载

c语言 sscanf 正则规则

c语言 sscanf 正则规则

sscanf正则规则
sscanf是C语言中用于解析字符串的函数之一,它可以根据指定的格式规则将字符串解析成所需的数据类型。

它的正则规则包括以下几个方面:
1. 数字格式
在解析数字时,sscanf使用以下格式规则:
%d 表示解析十进制整数
%u 表示解析无符号十进制整数
%o 表示解析八进制无符号整数
%x 表示解析十六进制无符号整数
%f 表示解析浮点数
%e 表示解析科学计数法浮点数
%c 表示解析字符
%s 表示解析字符串
%[] 表示解析字符集
%n 表示计算已解析的字符数
2. 字符串格式
在解析字符串时,sscanf使用以下格式规则:
%s 表示解析字符串,将忽略空格字符,直到遇到下一个非空格字符为止。

3. 宽度限定
在宽度限定中,可以使用数字指定要解析的字符数,例如:
%2s 表示解析最多包含2个字符的字符串
%.*s 表示解析任意宽度的字符串,并将宽度保存在参数中。

4. 精度限定
在精度限定中,可以使用数字指定要解析的精度的位数或小数位数,例如:
%.2f 表示解析浮点数时保留两位小数
%.5s 表示解析字符串时最多解析5个字符
5. 符号格式
在符号格式中,可以使用以下格式规则:
%+ 表示要求必须是有符号的数值
%- 表示要求必须是有符号的数值,并且需要从低位到高位解析。

6. 特殊格式
除了上述格式规则之外,还有一些特殊的格式规则:
%n 表示计算已解析的字符数,并将该值存储在参数中。

%t 表示跳过一个字符。

sscanf安全函数

sscanf安全函数

sscanf安全函数
一、介绍
sscanf安全函数是一种可以用来检查用户输入格式以保护程序免受攻击的安全函数。

它与sscanf的用法类似,但是比sscanf更安全,更可靠。

二、使用
sscanf安全函数可以在C语言程序中用来检查用户输入的格式和内容是否正确。

例如,如果你想要检查输入的字符串是不是以一个字母开头,那么你可以使用sscanf安全函数进行检查:
int check_string(char *str)
{
char ch;
int retval = sscanf_s(str, '%1s', &ch, 1);
if (retval == 1)
{
return 0;
}
return -1;
}
如果输入的字符串是以一个字母开头,函数就会返回0,否则就会返回-1。

三、优点
sscanf安全函数有如下优点:
(1)它可以有效地帮助程序员检查用户输入的格式,从而减少程序出错的可能性;
(2)它可以有效地防止攻击者利用输入的错误格式攻击程序;
(3)它简化了程序代码,让程序变得更加简洁。

四、缺点
sscanf安全函数也存在一些缺点,比如:
(1)只能用来检查单一的字符串格式;
(2)复杂的格式可能会很难检查;
(3)如果输入字符串超出了一定的长度,可能会引发安全问题。

sscanf函数的高级用法

sscanf函数的高级用法

原问题:
iios/12DDWDFF@122
获取/和@之间的字符串怎么做
C程序里面有什么函数吗?
周星星的代码:
#include
int main()
{
const char* s = "iios/12DDWDFF@122";
char buf[20];
sscanf( s, "%*[^/]/%[^@]", buf );
sscanf函数用法总结
很久以前,我以为c没有自己的split string函数,后来我发现了sscanf;一直以来,我以为sscanf只能以空格来界定字符串,现在我发现我错了。
sscanf是一个运行时函数,原形很简单:
int sscanf(
const char *buffer,
const char *format [,
6、给定一个字符串iios/12DDWDFF@122,获取 / 和 @ 之间的字符串,
先将 "iios/"过滤掉,再将非'@'的一串内容送到buf中
sscanf("iios/12DDWDFF@122", "%*[^/]/%[^@]", buf);
printf("%s\n", buf);
printf("%s\n", buf);
结果为:123456
4. 取仅包含指定字符集的字符串。如在下例中,取仅包含1到9和小写字母的字符串。
sscanf("123456abcdedfBCDEF", "%[1-9a-z]", buf);

C语言中sscanf()函数的字符串格式化用法

C语言中sscanf()函数的字符串格式化用法

C语⾔中sscanf()函数的字符串格式化⽤法介绍sscanf()为C语⾔标准库函数,⽤于从指定字符串中读⼊与指定格式相符的数据。

函数原型声明在stdio.h头⽂件中:int sscanf(const char *str, const char *format, ...);该函数根据参数format(格式化字符串)来转换参数str指向的字符串,转换后的结果存于对应的可变参数内。

其返回值为按照指定格式转换符成功读⼊且赋值的可变参数数⽬(若发⽣匹配错误⽽部分成功,该数⽬会⼩于指定的参数数⽬,甚⾄为0)。

若⾸次成功转换或错误匹配发⽣前输⼊已结束(如str为空字符串),则返回EOF。

发⽣读取错误时也返回EOF,且设置错误码errno(如format为空指针时返回EOF并设置errno为EINVAL)。

可见,通过⽐较该函数的返回值与指定的可变参数数⽬,可判断格式转换是否成功。

format可为⼀个或多个{%[*] [width] [{h | l | L}]type | ' ' | '\t' | '\n' | ⾮%符号}格式转换符。

集合中{a|b|c}表⽰格式符a、b、c任选其⼀。

以中括号括起来的格式符可选。

%与type为必选,所有格式符必须以%开头。

以下简要说明各格式符的含义:1) 赋值抑制符'*'表明按照随后的转换符指⽰来读取输⼊,但将其丢弃不予赋值(“跳过”)。

抑制符⽆需相应的指针可变参数,该转换也不计⼊函数返回的成功赋值次数。

%*[width] [{h | l | L}]type 表⽰满⾜该条件的字符被过滤掉,不会向⽬标参数中赋值。

2) width表⽰最⼤读取宽度。

当读⼊字符数超过该值,或遇到不匹配的字符时,停⽌读取。

多数转换丢弃起始的空⽩字符。

这些被丢弃的字符及转换结果添加的空结束符('\0')均不计⼊最⼤读取宽度。

3) {h | l | L}为类型修饰符。

sscanf与sprintf用法

sscanf与sprintf用法
if(str4[0]=='\0')strcpy(str4,temp);
printf("%s\n%s\n%s\n%s\n",str1,str2,str3,str4);
}
return 0;
}
sscanf用法以及正则表达式的运用
表头文件 #include(stdio.h)
type :这就很多了,就是%s,%d之类。
特别的:
%*[width] [{h | l | I64 | L}]type 表示满足该条件的被过滤掉,不会向目标参数中写入值。如:
const char sourceStr[] = "hello, world";
char buf[10] = {0};
因为scanf在使用除了%c以外的格式时都忽略换行符'\n',题中用空行来区分不同case的要求
显得难以处理,如果使用sscanf的话,可以先把输入用scanf存入一块缓冲区当中,再用sscanf读取
这样大大减少了工作量。
#include <stdio.h>
int T[100];
int P[100];
);
int sprintf(
char *buffer,
const char *format,
...
);
功能:类似于scanf和printf 但从字符串*buffer用于输入输出
1.sprintf用于格式化字符串
把变量打印到字符串中,从而获得数字的字符形式,这样不需要手工转换。
例如
char c[100];
int k=255;
sprintf(c,"%d",k);

Linux C sscanf、sprintf、printf、strdup、strstr举例

Linux C sscanf、sprintf、printf、strdup、strstr举例

1、sscanf格式化函数(字符串 --> 变量)•将指定字符串,格式化(分割)至特定变量中time_t PubDateTimeToCalendar(const char * pszDateTime){if(pszDateTime == NULL)return 0;time_t tTime = 0;struct tm tm_Time;memset(&tm_Time 0 sizeof(tm_Time));sscanf(pszDateTime "%4d%2d%2d%2d%2d%2d"&(tm_Time.tm_year) &(tm_Time.tm_mon)&(tm_Time.tm_mday) &(tm_Time.tm_hour)&(tm_Time.tm_min) &(tm_Time.tm_sec));tm_Time.tm_year -= 1900; //tm_year从1900年算起tm_Time.tm_mon -= 1; //tm_mon为0-11tTime = mktime(&tm_Time);return tTime;}2、springf格式化函数(变量-->字符串)•十进制字符串(固定长度)sprint(szTmp “%04d” index);printf(“szTmp = %s” szTmp);结果就会得到: szTmp = 0123;•十进制字符串(非固定长度)sprint(szTmp “%d” index);printf(“szTmp = %s” szTmp);结果就会得到: szTmp = 123;•十六进制字符串(小写)(固定长度)sprint(szTmp “%08x” index);printf(“szTmp = %s” szTmp);结果就会得到: szTmp = 0000007d;•十六进制字符串(小写)(非固定长度)sprint(szTmp “%x” index);printf(“szTmp = %s” szTmp);结果就会得到: szTmp = 7d•十六进制字符串(大写)(固定长度)sprint(szTmp “%08X” index);prin tf(“szTmp = %s” szTmp);结果就会得到: szTmp = 0000007D;•十六进制字符串(大写)(非固定长度)sprint(szTmp “%X” index);printf(“szTmp = %s” szTmp);结果就会得到: szTmp = 7D;3、printf格式化函数(变量-->终端输出)同sprintf4、strdup函数•说明用法:#include <string.h>功能:复制字符串s 。

sprintf sscanf用法

sprintf sscanf用法

Sprintf函数功能:把格式化的数据写入某个字符串头文件:stdio.h函数原型:int sprintf( char *buffer, const char *format [, argument] … );返回值:字符串长度(strlen)参数说明及应用举例sprintf格式的规格如下所示。

[]中的部分是可选的。

%[指定参数$][标识符][宽度][.精度]指示符若想输出`%'本身时, 请这样`%%'处理。

1. 处理字符方向。

负号时表示从后向前处理。

2. 填空字元。

0 的话表示空格填0;空格是内定值,表示空格就放着。

3. 字符总宽度。

为最小宽度。

4. 精确度。

指在小数点后的浮点数位数。

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-转换字符=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-%% 印出百分比符号,不转换。

%c 整数转成对应的ASCII 字元。

%d 整数转成十进位。

%f 倍精确度数字转成浮点数。

%o 整数转成八进位。

%s 整数转成字符串。

%x 整数转成小写十六进位。

%X 整数转成大写十六进位。

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-格式化数字字符串sprintf 最常见的应用之一莫过于把整数打印到字符串中,所以,spritnf 在大多数场合可以替代itoa。

如://把整数123 打印成一个字符串保存在s 中。

sprintf(s, "%d", 123); //产生"123"可以指定宽度,不足的左边补空格:sprintf(s, "%8d%8d", 123, 4567); //产生:" 123 4567"当然也可以左对齐:sprintf(s, "%-8d%8d", 123, 4567); //产生:"123 4567"也可以按照16 进制打印:sprintf(s, "%8x", 4567); //小写16 进制,宽度占8 个位置,右对齐sprintf(s, "%-8X", 4568); //大写16 进制,宽度占8 个位置,左对齐这样,一个整数的16 进制字符串就很容易得到,但我们在打印16 进制内容时,通常想要一种左边补0 的等宽格式,那该怎么做呢?很简单,在表示宽度的数字前面加个0 就可以了。

C语言中scanf用法运用和意义

C语言中scanf用法运用和意义

C语言中sccanf用法、运用和意义vavsscanf用法以及正则表达式的运用表头文件#include(stdio.h)定义函数int sscanf (const char *str,const char * format,........);函数说明sscanf()会将参数str的字符串根据参数format字符串来转换并格式化数据。

格式转换形式请参考scanf()。

转换后的结果存于对应的参数内。

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

周星星的代码:#include <stdio.h>int main(){const char* s = "iios/12DDWDFF@122";char buf[20];sscanf( s, "%*[^/]/%[^@]", buf );printf( "%s\n", buf );return 0;}结果为:12DDWDFFsscanf与scanf类似,都是用于输入的,只是后者以屏幕(stdin)为输入源,前者以固定字符串为输入源。

函数原型:int scanf( const char *format [,argument]... );其中的format可以是一个或多个{%[*] [width] [{h | l | I64 | L}]type | ' ' | '\t' | '\n' | 非%符号},注:{a|b|c}表示a,b,c中选一,[d],表示可以有d也可以没有d。

width:宽度,一般可以忽略,用法如:const char sourceStr[] = "hello, world";char buf[10] = {0};sscanf(sourceStr, "%5s", buf); //%5s,只取5个字符cout << buf<< endl;结果为:hello{h | l | I64 | L}:参数的size,通常h表示单字节size,I表示2字节size,L表示4字节size(double 例外),l64表示8字节size。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

sscanf,sscanf_s 及其相关用法 #include<stdio.h> 定义函数 int sscanf (const char *str,const char * format,........); 函数说明 sscanf()会将参数 str 的字符串根据参数 format 字符串来转换并格式化数据。

格式转换形式请参 考 scanf()。

转换后的结果存于对应的参数内。

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

返回0表示失败 否则,表 示正确格式化数据的个数 例如:sscanf(str,"%d%d%s", &i,&i2, &s); 如果三个变成都读入成 功会返回3。

如果只读入了第一个整数到 i 则会返回1。

证明无法从 str 读入第二个整数。

main() { int i; unsigned int j; char input[ ]=”10 0x1b aaaaaaaa bbbbbbbb”; char s[5]; sscanf(input,”%d %x %5[a-z] %*s %f”,&i,&j,s,s); printf(“%d %d %s ”,i,j,s); } 执行 10 27 aaaaa 大家都知道 sscanf 是一个很好用的函数,利用它可以从字符串中取出整数、浮点数和字符串等等。

它的使用方法简单, 特别对于整数和浮点数来说。

但新手可能并不知道处理字符串时的一些高级用法, 这里做个简要说明吧。

1. 常见用法。

charstr[512]={0}; sscanf("123456","%s",str); printf("str=%s",str); 2. 取指定长度的字符串。

如在下例中,取最大长度为4字节的字符串。

sscanf("123456","%4s",str);printf("str=%s",str); 3. 取到指定字符为止的字符串。

如在下例中,取遇到空格为止字符串。

sscanf("123456abcdedf","%[^]",str); printf("str=%s",str); 4. 取仅包含指定字符集的字符串。

如在下例中,取仅包含1到9和小写字母的字符串。

sscanf("123456abcdedfBCDEF","%[1-9a-z]",str); printf("str=%s",str); 5. 取到指定字符集为止的字符串。

如在下例中,取遇到大写字母为止的字符串。

sscanf("123456abcdedfBCDEF","%[^A-Z]",str); printf("str=%s",str); //////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////// 可以用如下代码将字符串形式的 ip 地址转换为四个整数:   char * inputIp int ip[4]; sscanf_s(inputIp, "%d.%d.%d.%d", &ip[0], &ip[1],&ip[2],&ip[3]);注意 sscanf_s,当读入的类型是整数或其它长度可以确定的类型时,不能在类型后面跟上长度,但 是对于字符串类型(char *)长度无法得知则必须在类型后面明确指出字符串的最大长度(即可以容纳 的空间)。

举例如下:        int main(void )  {  char tokenstring[] ="15 12 14...";  char s[81];  char c;  int i;  float fp;  #include <stdio.h> #include <stdlib.h> // crt_sscanf_s.c // This program uses sscanf_s to read data items // from a string named tokenstring, then displays them. // Input various data from tokenstring:  // max 80 character string plus NULL terminator  sscanf_s( tokenstring, "%s", s, _countof(s) );  sscanf_s( tokenstring, "%c", &c,sizeof(char) );  sscanf_s( tokenstring, "%d", &i );  sscanf_s( tokenstring, "%f", &fp );   // Output the data read  printf_s( "String = %s\n", s );  printf_s( "Character = %c\n", c );  printf_s( "Integer: = %d\n", i );  printf_s( "Real: = %f\n", fp );  }对于多个字符串读入的情况,代码如下: sscanf_s(inputString,"%s.%s.%s.%s", s1, s1.length, s2, s2.length, s3, s3.length, s4, s4.length);sscanf 函数非常好用,居然我以前一直不知道这个函数。

最近朋友用 VS2008写程序时用到这个函 数的安全版本 sscanf_s ,却出现异常问题,无法解析字符串不说,还会崩溃。

int sscanf_s( const char *buffer, const char *format [, argument ] ... ); 这是 MSDN 里面关于函数的定义,没有继续详细查看后面的备注,以及实例的情况下。

根本感觉不到 sscanf 与 sscanf_s 的区别。

以为仍然是像 sscanf 一样使用,以致出现奇怪问题。

Example: // crt_sscanf_s.c // This program uses sscanf_s to read data items // from a string named tokenstring, then displays them. #include <stdio.h> #include <stdlib.h> int main( void ) { char char char tokenstring[] = "15 12 14..."; s[81]; c;inti;float fp; // Input various data from tokenstring: // max 80 character string plus NULL terminator sscanf_s( tokenstring, "%s", s, _countof(s) ); sscanf_s( tokenstring, "%c", &c, sizeof(char) ); sscanf_s( tokenstring, "%d", &i ); sscanf_s( tokenstring, "%f", &fp ); // Output the data read printf_s( "String = %s\n", s ); printf_s( "Character = %c\n", c ); printf_s( "Integer: = %d\n", i ); printf_s( "Real: } 直到看完整个文档,看到这个实例,才发现原来还有猫腻!sscanf_s 取值的时候,需要在每个取值后面 指定取值的最大大小。

= %f\n", fp );在使用 VS2005编译一个程序时,出现了很多警告,说是用的函数是不安全的,应当使用安全版本, 即函数名称增加“_s”的版本。

警告内容: warning C4996: 'sscanf': This function or variable may be unsafe. Consider using sscanf_s instead.据了解,“_s”版本函数是微软后来对 c++做得扩展,用来替代原先不安全的函数,例如:printf、 scanf、strcpy、fopen 等等。

详细参考: ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.chs/dv_vccrt/html/d9568b0 8-9514-49cd-b3dc-2454ded195a3.htm 原来安全版本的函数,对参数和缓冲边界做了检查,增加了返回值和抛出异常。

这样增加了函数的安 全性,减少了出错的几率。

同时这也意味着在使用这些函数时,有时你不得不输入更多的关于缓冲区大小的参数,多敲几下键盘 能换来更少的麻烦,值得! 下面总结了 sscanf 的以及 sscanf_s 的常用方法,也体现了“_s”版本函数与原函数的特别之处:1、sscanf 和 scanf 的不同是输入来源,前者是一个字符串,后者则是标准输入设备 2、sscanf 的使用,以解析时间字符串为例,将字符串“2009-01-02_11:12:13”解析为整型年月日 时分秒 //定义 char cc; tm tm_temp={0}; string stime("2009-01-02_11:12:13"); //(1) 必须严格按照分隔符形式匹配填写,若遇到不匹配项则终止解析sscanf(stime.c_str(), "%4d-%2d-%2d_%2d:%2d:%2d", &tm_temp.tm_year, &tm_temp.tm_mon, &tm_temp.tm_mday, &tm_temp.tm_hour, &tm_temp.tm_min, &tm_temp.tm_sec );//(2) 可 以 不 按 照 分 割 符 号 形 式 填 写 , 字 符 数 必 须 一 致 , 例 如 可 以 正 确 解 析 “2009/01/02_11:12:13”sscanf(stime.c_str(), "%4d%c%2d%c%2d%c%2d%c%2d%c%2d", &tm_temp.tm_year, &cc, &tm_temp.tm_mon, &cc, &tm_temp.tm_mday, &cc, &tm_temp.tm_hour, &cc,&tm_temp.tm_min, &cc, &tm_temp.tm_sec );//(3) 可以不按照分割符号形式填写,字符数必须一致,同上,%1s 可以等同于%csscanf(stime.c_str(), "%4d%1s%2d%1s%2d%1s%2d%1s%2d%1s%2d", &tm_temp.tm_year, &cc, &tm_temp.tm_mon, &cc, &tm_temp.tm_mday, &cc, &tm_temp.tm_hour, &cc, &tm_temp.tm_min, &cc, &tm_temp.tm_sec ); //(4) 可 以 不 按 照 分 割 符 形 式 和 数 量 填 写 , 类 型 必 须 一 致 , 例 如 可 以 正 确 解 析 “2009/01/02___11:12:13” //这里使用了 sscanf 的正则表达式,与通用的正则表示类似但不完全相同,%*c 表示忽略连续多个 字符sscanf(stime.c_str(), "%4d%*c%2d%*c%2d%*c%2d%*c%2d%*c%2d", &tm_temp.tm_year, &tm_temp.tm_mon, &tm_temp.tm_mday, &tm_temp.tm_hour, &tm_temp.tm_min, &tm_temp.tm_sec );3、sscanf_s 的使用//定义 char cc[2]; tm tm_temp={0}; string stime("2009-01-02_11:12:13"); //(1) 与 sscanf 第一种方法相同,可以使用"%4d-%2d-%2d_%2d:%2d:%2d"格式匹配解析sscanf_s(stime.c_str(), "%4d-%2d-%2d_%2d:%2d:%2d", &tm_temp.tm_year, &tm_temp.tm_mon, &tm_temp.tm_mday, &tm_temp.tm_hour, &tm_temp.tm_min, &tm_temp.tm_sec );//(2) 使用%c 格式对数据解析时,必须对相应的缓冲区增加长度参数,否则将会出错sscanf_s(stime.c_str(), "%4d%c%2d%c%2d%c%2d%c%2d%c%2d", &tm_temp.tm_year, &cc, 1, &tm_temp.tm_mon, &cc, 1, &tm_temp.tm_mday, &cc, 1, &tm_temp.tm_hour, &cc, 1, &tm_temp.tm_min, &cc, 1, &tm_temp.tm_sec );//(3) 使用%s 格式对数据解析时,缓冲长度必须大于字符串长度,否则不予解析sscanf_s(stime.c_str(), "%4d%1s%2d%1s%2d%1s%2d%1s%2d%1s%2d", &tm_temp.tm_year, &cc, 2, &tm_temp.tm_mon, &cc, 2, &tm_temp.tm_mday, &cc, 2, &tm_temp.tm_hour, &cc, 2, &tm_temp.tm_min, &cc, 2, &tm_temp.tm_sec ); //(4) 与 sscanf 一样,sscanf_s 同样支持正则表达式sscanf_s(stime.c_str(), "%4d%*c%2d%*c%2d%*c%2d%*c%2d%*c%2d", &tm_temp.tm_year, &tm_temp.tm_mon, &tm_temp.tm_mday, &tm_temp.tm_hour, &tm_temp.tm_min, &tm_temp.tm_sec );通过以上对比 sscanf 与 sscanf_s 的使用,可以看出后者对缓冲区安全有了更多的考虑,从而避免 了许多不经意的烦恼。

相关文档
最新文档