您的位置:首页 > 编程语言 > C语言/C++

C语言—sscanf函数使用总结

2016-03-26 16:03 363 查看

前言

最近工作中,需要写测试程序读取文件中数据,一行行的使用sscanf函数提取相应字段,今天就小小的总结下。

函数原型说明

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


  1、 sscanf属于scanf函数家族一员,从输入源—字符串中将参数buffer的字符串根据参数format字符串来转换并格式化数据,转换后的结果存于对应的参数内。

  2、 format 是格式控制字符串,它包含控制字符(如:%d,%i,%s等),空白字符(如:空格、制表符\t、回车换行符\n或其连续组合)以及非空白字符;

  3、 …是一组指针变量,是上述函数用来保存结果值的;

  4、 返回值为被成功赋值的指针变量的个数,如果该函数发生错误,则返回EOF(-1)。

格式控制说明

format可以是一个或多个 {%[*] [width] [{h | l | I64 | L}]type | ’ ’ | ‘\t’ | ‘\n’ | 非%符号}

该公式中符号解释如下:

  1、 * 也可用于格式中, (即 %* d 和 %* s) 加了星号 ( * ) 表示跳过此数据不读入. (也就是不把此数据读入参数中)

  2、{a|b|c}表示a,b,c中选一

  3、[d],表示可以有d也可以没有d

  4、width表示读取宽度。

  5、{h | l | I64 | L}:参数的size,通常h表示单字节size,I表示2字节 size,L表示4字节size(double例外),l64表示8字节size。

  6、type :这就很多了,就是%s,%d之类。

  7、特别的:%*[width] [{h | l | I64 | L}]type 表示满足该条件的被过滤掉,不会向目标参数中写入值

支持集合操作:

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

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

  %[^a] 匹配非a的任意字符,贪婪性

注意事项

  1、待赋值字段一定要初始化,否则会出现段错误

  2、操作文件时,读取源字符串时,format格式化中最好加换行符”\n”

  3、format格式化字符串中如果操作多种数据类型,类似源字符串–“aaa:2008:22.3”,format–”%s:%d:%lf”, 这样做会导致源字符串直接赋值给第一个字段,所以这时候要给字符串加空格作为结束标志

  

源字符串: aaa:2008:22.3
format: %[^:]:%d:%lf


源字符串:aaa :2008:22.3
format: %s%*[ ]:%d:%lf


就酱!

 

总结

sscanf函数避免了手工操作字符串的行为,尤其注意该函数不会验证指针参数的类型是否对应format格式代码中的正确类型。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言