强大的sscanf函数

来源:互联网 发布:matlab数据预处理 编辑:程序博客网 时间:2024/05/01 00:28

函数原型

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

参数说明

buffer
  存储的数据
format
  格式控制字符串。
argument
  可选自变量
  

头文件

sscanf

说明

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 表示没有分配任何字段。 返回值是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*均为地址)

作用

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

使用实例:

  1. 一般用法
char buf[512] = ;sscanf("123456 ", "%s", buf);printf("%s\n", buf);

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

sscanf("123456 ", "%4s", buf);printf("%s\n", buf);

结果为:1234

  1. 取到指定字符为止的字符串。如在下例中,取遇到空格为止字符串。
sscanf("123456 abcdedf", "%[^ ]", buf);printf("%s\n", buf);

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

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

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

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

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

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

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

sscanf(“hello, world”, "%*s%s", buf);printf("%s\n", buf);

结果为:world
P.S. %*s表示第一个匹配到的%s被过滤掉,即hello被过滤了,如果没有空格则结果为NULL。
8. 最后给一个转换点分十进制ip的实例

#include <stdio.h>void main(){    unsigned char buf[5];    char ipaddr[32]="192.168.1.2/22";    sscanf(ipaddr,"%d.%d.%d.%d/%d",buf,buf+1,buf+2,buf+3,buf+4);    printf("%d.%d.%d.%d/%d\n",buf[0],buf[1],buf[2],buf[3],buf[4]);}

注意后面的buf,buf+1…都是地址,千万不能写成buf[0],buf[1]…这样sscanf取出来的数存在地址为buf[0]的空间里,会产生段错误的。

原创粉丝点击