sscanf 订阅
sscanf读取格式化的字符串中的数据。swscanf 是 sscanf 的宽字符版本;swscanf 的参数是宽字符串。 swscanf不处理 Unicode 全角十六进制或"兼容性区"字符。 除此以外,swscanf 和 sscanf 的行为完全相同。 [1] 展开全文
sscanf读取格式化的字符串中的数据。swscanf 是 sscanf 的宽字符版本;swscanf 的参数是宽字符串。 swscanf不处理 Unicode 全角十六进制或"兼容性区"字符。 除此以外,swscanf 和 sscanf 的行为完全相同。 [1]
信息
头文件
stdio.h
类    别
C数据输入
参    数
宽字符串
功    能
读取格式化的字符串中的数据
返回值
函数将返回成功赋值的字段个数
外文名
sscanf
sscanf函数语法
[1] 
收起全文
精华内容
下载资源
问答
  • 基于sscanf实现的json c解码库,体积非常小。实现了字符串,整数,浮点数的解析。纯c实现,易于移植。 只有几十行代码量,编译后体积不到1K。
  • sscanf

    2021-03-30 13:15:37
    sscanf 1. 取指定长度的字符串 #include<stdio.h> #include<string.h> int main() { char str[100]; sscanf("12345","%4s",str); printf("%s\n",str); return 0; } /* 1234 */ 2. 格式化时间 #...

    sscanf

    1. 取指定长度的字符串

    #include<stdio.h>
    #include<string.h>
    int main()
    {
    	char str[100];
    	sscanf("12345","%4s",str);
    	printf("%s\n",str);
    	return 0;
    }
    /*
    1234
    */
    

    2. 格式化时间

    #include<stdio.h>
    #include<string.h>
    int main()
    {
    	int year, month, day, hour, minute, second;
    	sscanf("2013/02/13 14:55:34","%d/%d/%d %d:%d:%d",&year, &month, &day, &hour, &minute, &second);
    	printf("time=%d-%d-%d %d:%d:%d\n", year, month, day, hour, minute, second);
    	return 0;
    }
    /*
    time=2013-2-13 14:55:34
    */
    

    3. 读入字符串

    #include<stdio.h>
    #include<string.h>
    int main()
    {
    	char str[100];
    	sscanf("12345","%s",str);
    	printf("%s\n",str);
    	return 0;
    }
    /*
    12345
    */
    

    4. %*d和%s加了()表示跳过此数据不读入(也就是不把此数据读入参数中)

    #include<stdio.h>
    #include<string.h>
    int main()
    {
    	char str[100];
    	sscanf("1234abcd","%*d%s",str);
    	printf("%s\n",str);
    	return 0;
    }
    /*
    abcd
    */
    

    5. 取到指定字符为止的字符串。如例子所示,遇到‘+’为止的字符串。

    #include<stdio.h>
    #include<string.h>
    int main()
    {
    	char str[100];
    	sscanf("1234+abc","%[^+]",str);
    	printf("%s\n",str);
    	return 0;
    }
    /*
    1234
    */
    

    6. 取到指定字符集为止的字符串。如遇到小写字母为止的字符串。

    #include<stdio.h>
    #include<string.h>
    int main()
    {
    	char str[100];
    	sscanf("1234+abc1234","%[^a-z]",str);
    	printf("%s\n",str);
    	return 0;
    }
    /*
    1234+
    */
    

    7. 取仅包含指定字符集的字符串。(取仅包含数字和小写字母的字符串,是取得连续的字符串)。

    #include<stdio.h>
    #include<string.h>
    int main()
    {
    	char str[100];
    	sscanf("123456abcdefBFRGTY7890","%[1-9a-z]",str);
    	printf("%s\n",str);
    	return 0;
    }
    
    展开全文
  • sscanf() – 从一个字符串中读进与指定格式相符的数据.  函数原型:  Int sscanf( string str, string fmt, mixed var1, mixed var2 ... );  int scanf( const char *format [,argument]... );  说明:  ...
  • C语言或者C++ 中的sscanf的一些操作练习进行详解,一般用来分割字符串; 如固定格式的ch = "\"aa bb cc\" \"dd ff gg\"";
  • 名称:sscanf() – 从一个字符串中读进与指定格式相符的数据. 代码如下:函数原型:Int sscanf( string str, string fmt, mixed var1, mixed var2 … );int scanf( const char *format [,argument]… );说明:sscanf与...
  • 作者:杨硕,华清远见嵌入式学院讲师。  考察C程序员是否合格的一...下面就以此为例,利用strstr函数和sscanf函数解析GPS数据。  GPS输出的数据格式如下:  $GPGGA,121252.000,3937.3032,N,11611.*6,E,1,05,2.0,45
  • C语言sscanf()函数:从字符串中读取指定格式的数据 头文件: #include sscanf()函数用于从字符串中读取指定格式的数据,其原型如下:   int sscanf (char *str, char * format [, argument, ...]); 【参数】...
  • sscanf陷阱

    2018-03-09 17:31:26
    sscanf使用的时候有一个陷阱,存入的数是32的,如果不到32位,会发生内存越界!
  • 介绍的是C语言中sscanf()函数,本文介绍了sscanf()函数的含义与用法,对大家日常使用C语言的sscanf()函数很有帮助,有需要的可以参考借鉴。
  • sscanf()用法domeVs2010

    2015-11-13 15:40:44
    sscanf() 用法 dome Vs2010
  • 详细的c语言正则表达式用法,sscanf的正则表达不会用的必看
  • sscanf字符串提取

    2020-12-20 01:59:16
    functionsscanfint sscanf ( const char * s, const char * format, ...);Read formatted data from stringReads data from s and stores them according to parameter format into the locations given by the addi...

    function

    sscanf

    int sscanf ( const char * s, const char * format, ...);

    Read formatted data from string

    Reads data from s and stores them according to parameter format into the locations given by the additional arguments, as if scanf was used, but reading from s instead of the standard input (stdin).

    The additional arguments should point to already allocated objects of the type specified by their corresponding format specifier within the format string.

    Parameters

    s

    C string that the function processes as its source to retrieve the data.

    format

    C string that contains a format string that follows the same specifications as format in scanf (see scanf for details).

    ... (additional arguments)

    Depending on the format string, the function may expect a sequence of additional arguments, each containing a pointer to allocated storage where the interpretation of the extracted characters is stored with the appropriate type.

    There should be at least as many of these arguments as the number of values stored by the format specifiers. Additional arguments are ignored by the function.

    Return Value

    On success, the function returns the number of items in the argument list successfully filled. This count can match the expected number of items or be less (even zero) in the case of a matching failure.

    In the case of an input failure before any data could be successfully interpreted, EOF is returned.

    函数原型:

    int sscanf( const char *, const char *, ...);

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

    format格式控制字符串

    argument 选择性设定字符串

    sscanf会从buffer里读进数据,依照format的格式将数据写入到argument里。

    头文件

    #include 或者

    #include

    返回值

    成功则返回参数数目,失败则返回-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均为地址)

    sscanf与scanf类似,都是用于输入的,只是后者以键盘(stdin)为输入源,前者以固定字符串为输入源。

    格式控制符,类似于正则表达式:

    sscanf的第二个参数可以是一个或多个 {%[*] [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 ,否则返回格式化的参数个数

    支持集合操作

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

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

    %[^a] 匹配非a的任意字符,并且停止读入,贪婪性

    例子

    1. 常见用法。

    结果为:123456

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

    结果为:1234

    3. 取到指定字符为止的字符串。如在下例中,取遇到任意小写字母为止的字符串。

    结果为:123456

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

    结果为:123456abcdedf

    当输入:  sscanf("123456abcdedfBCDEF","%[1-9A-Z]",buf);

    结果为:123456BCDEF(错!!)

    注:结果应该为:123456【因为遇到不是1-9或者A-Z的字符时,即遇到小写字母时,就已经结束】

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

    结果为:123456abcdedf

    6、给定一个字符串iios/12DDWDFF@122,获取 / 和 @ 之间的字符串,

    先将 "iios/"过滤掉,再将非'@'的一串内容送到buf中

    结果为:12DDWDFF

    7、给定一个字符串“hello, world”,仅保留world。

    (注意:“,”之后有一空格,%s遇空格停止,加*则是忽略第一个读到的字符串)

    结果为:world

    %*s表示第一个匹配到的%s被过滤掉,即“hello,”被过滤了

    如果没有空格则结果为NULL。

    8、最简明的格式是tab间隔的字符串

    结果为:字符串1 字符串2 字符串3

    sscanf及sscanf_s的常用方法,原来安全版本的函数,对参数和缓冲边界做了检查,增加了返回值和抛出异常。这样增加了函数的安全性,减少了出错的几率。

    同时这也意味着在使用这些函数时,有时你不得不输入更多的关于缓冲区大小的参数,多敲几下键盘能换来更少的麻烦,值得!

    下面总结了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可以等同于%c

    sscanf(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的使用,可以看出后者对缓冲区安全有了更多的考虑,从而避免了许多不经意的烦恼。

    大家都知道sscanf是一个很好用的函数,利用它可以从字符串中取出整数、浮点数和字符串等等。它的使用方法简单,特别对于整数和浮点数来说。但新手可 能并不知道处理字符串时的一些高级用法,这里做个简要说明吧。

    #include

    #include

    int main() {

    char input[] = "{\"Vesion\":1.0,\"cmd\":\"live\",\"data\":{\"action\":\"play\",\"params\" : [{\"type\":\"video1\",\"media_ip\":\"192.168.89.4\",\"channel\":1}]}}";

    char ip[16];

    int stream;

    char *pstr = strstr(input, "media_ip");

    printf("pstr=%s\n",pstr+11);

    int ret=sscanf(strstr(input,"media_ip")+11, "%[0-9.]%*[^:]:%d[0-9]",ip,&stream);  // 这里必须是取地址

    printf("ret=%d,ip=%s,stream=%d\n",ret,ip,stream);

    printf("Over");

    getchar();

    return 0;

    }

    展开全文
  • sscanf 详细说明

    2021-03-04 06:19:11
    sscanf名称:sscanf() - 从一个字符串中读进与指定格式相符的数据.函数原型:Int sscanf( string str, string fmt, mixed var1, mixed var2 ... );int scanf( const char *format [,argument]... );说明:sscanf与...

    sscanf

    名称:

    sscanf() - 从一个字符串中读进与指定格式相符的数据.

    函数原型:

    Int sscanf( string str, string fmt, mixed var1, mixed var2 ... );

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

    说明:

    sscanf与scanf类似,都是用于输入的,只是后者以屏幕(stdin)为输入源,前者以固定字符串为输入源。

    其中的format可以是一个或多个 {%[*] [width] [{h | l | 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 表示满足该条件的被过滤掉,不会向目标参数中写入值

    支持集合操作:

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

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

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

    例子:

    1. 常见用法。

    char buf[512] = ;

    sscanf("123456 ", "%s", buf);

    printf("%s\n", buf);

    结果为:123456

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

    sscanf("123456 ", "%4s", buf);

    printf("%s\n", buf);

    结果为:1234

    3. 取到指定字符为止的字符串。如在下例中,取遇到空格为止字符串。

    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

    %*s表示第一个匹配到的%s被过滤掉,即hello被过滤了

    如果没有空格则结果为NULL。

    sscanf的功能很类似于正则表达式, 但却没有正则表达式强大,所以如果对于比较复杂的字符串处理,建议使用正则表达式.

    //-------------------------------------------------------

    sscanf,表示从字符串中格式化输入

    上面表示从str中,输入数字给x,就是32700

    久以前,我以为c没有自己的split string函数,后来我发现了sscanf;一直以来,我以为sscanf只能以空格来界定字符串,现在我发现我错了。

    sscanf是一个运行时函数,原形很简单:

    int sscanf(

    const char *buffer,

    const char *format [,

    argument ] ...

    );

    它强大的功能体现在对format的支持上。

    我以前用它来分隔类似这样的字符串2006:03:18:

    int a, b, c;

    sscanf("2006:03:18", "%d:%d:%d", a, b, c);

    以及2006:03:18 - 2006:04:18:

    char sztime1[16] = "", sztime2[16] = "";

    sscanf("2006:03:18 - 2006:04:18", "%s - %s", sztime1, sztime2);

    但是后来,我需要处理2006:03:18-2006:04:18

    仅仅是取消了‘-’两边的空格,却打破了%s对字符串的界定。

    我需要重新设计一个函数来处理这样的情况?这并不复杂,但是,为了使所有的代码都有统一的风格,我需要改动很多地方,把已有的sscanf替换成我自己的分割函数。我以为我肯定需要这样做,并伴随着对sscanf的强烈不满而入睡;一觉醒来,发现其实不必。

    format-type中有%[]这样的type field。如果读取的字符串,不是以空格来分隔的话,就可以使用%[]。

    %[]类似于一个正则表达式。[a-z]表示读取a-z的所有字符,[^a-z]表示读取除a-z以外的所有字符。

    所以那个问题也就迎刃而解了:

    sscanf("2006:03:18 - 2006:04:18", "%[0-9,:] - %[0-9,:]", sztime1, sztime2);

    在softmse (Jake) 的问题贴http://community.csdn.net/Expert/topic/4843/4843294.xml?temp=.4321558中 ,周星星给出了一个很cool的sscanf用例,而后通过学习,发现sscanf真棒,现做一总结。

    scanf 原型:

    # include ;

    int scanf( const char *format, ... );

    函数 scanf() 是从标准输入流 stdin 中读内容的通用子程序,可以读入全部固有类型的数据并自动转换成机内形式。scanf() 是 printf() 的补函数。

    在 C99 中,format 用 restrict 修饰。

    format 指向的控制串由以下三类字符组成:

    ● 格式说明符

    ● 空白符

    ● 非空白符

    输入格式说明符前缀为百分号(%),告诉 scanf() 下次读入何种数据类型。这些格式说明符的清单如下表所示:

    ┏━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓

    ┃ 代  码 │             意                          义             ┃

    ┠────┼────────────────────────────┨

    ┃   %a   │读浮点值(仅适用于 C99)                                  ┃

    ┃   %A   │读浮点值(仅适用于 C99)                                  ┃

    ┃   %c   │读单字符                                                ┃

    ┃   %d   │读十进制整数                                            ┃

    ┃   %i   │读十进制、八进制、十六进制整数                          ┃

    ┃   %e   │读浮点数                                                ┃

    ┃   %E   │读浮点数                                                ┃

    ┃   %f   │读浮点数                                                ┃

    ┃   %F   │读浮点数(仅适用于 C99)                                  ┃

    ┃   %g   │读浮点数                                                ┃

    ┃   %G   │读浮点数                                                ┃

    ┃   %o   │读八进制数                                              ┃

    ┃   %s   │读字符串                                                ┃

    ┃   %x   │读十六进制数                                            ┃

    ┃   %X   │读十六进制数                                            ┃

    ┃   %p   │读指针值                                                ┃

    ┃   %n   │至此已读入值的等价字符数                                ┃

    ┃   %u   │读无符号十进制整数                                      ┃

    ┃  %[ ]  │扫描字符集合                                            ┃

    ┃   %%   │读 % 符号(百分号)                                       ┃

    ┗━━━━┷━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

    例如: %s 表示读串而 %d 表示读整数。格式串的处理顺序为从左到右,格式说明符逐一与变元表中的变元匹配。为了读取长整数,可以将 l(ell) 放在格式说明符的前面;为了读取短整数,可以将 h 放在格式说明符的前面。这些修饰符可以与 d、i、o、u 和 x 格式代码一起使用。

    默认情况下,a、f、e 和 g 告诉 scanf() 为 float 分配数据。 如果将 l(ell) 放在这些修饰符的前面,则 scanf() 为 double 分配数据。使用 L 就是告诉 scanf(),接收数据的变量是 long double 型变量。

    如果使用的现代编译器程序支持 1995 年增加的宽字符特性, 则可以与 c 格式代码一起,用 l 修饰符说明类型 wchar_t 的宽字符指针;也可以与 s 格式代码一起,用 l 修饰符说明宽字符串的指针。l 修饰符也可以用于修饰扫描集,以说明宽字符。

    控制串中的空白符使 scanf() 在输入流中跳过一个或多个空白行。空白符可以是空格(space)、制表符(tab)和新行符(newline)。 本质上,控制串中的空白符使 scanf() 在输入流中读,但不保存结果,直到发现非空白字符为止。

    非空白符使 scanf() 在流中读一个匹配的字符并忽略之。例如,"%d,%d" 使 scanf() 先读入一个整数,读入中放弃逗号,然后读另一个整数。如未发现匹配,scanf() 返回。

    scanf() 中用于保存读入值的变元必须都是变量指针,即相应变量的地址。

    在输入流中,数据项必须由空格、制表符和新行符分割。逗号和分号等不是分隔符,比如以下代码:

    scanf( "%d %d", &r, &c );

    将接受输入 10 20,但遇到 10,20 则失败。

    百分号(%)与格式符之间的星号(*)表示读指定类型的数据但不保存。因此,

    scanf( "%d %*c %d", &x, &y );

    对 10/20 的读入操作中,10 放入变量 x,20 放入 y。

    格式命令可以说明最大域宽。 在百分号(%)与格式码之间的整数用于限制从对应域读入的最大字符数。例如,希望向 address 读入不多于 20 个字符时,可以书写成如下形式:

    scanf( "%20s", address );

    如果输入流的内容多于 20 个字符,则下次 scanf() 从此次停止处开始读入。 若达到最大域宽前已遇到空白符,则对该域的读立即停止;此时,scanf() 跳到下一个域。

    虽然空格、制表符和新行符都用做域分割符号,但读单字符操作中却按一般字符处理。例如,对输入流 "x y" 调用:

    scanf( "%c%c%c", &a, &b, &c );

    返回后,x 在变量 a 中,空格在变量 b 中,y 在变量 c 中。

    注意,控制串中的其它字符,包括空格、制表符和新行符,都用于从输入流中匹配并放弃字符,被匹配的字符都放弃。例如,给定输入流 "10t20",调用:

    scanf( "%dt%d", &x, &y );

    将把 10 和 20 分别放到 x 和 y 中,t 被放弃,因为 t 在控制串中。

    ANSI C 标准向 scanf() 增加了一种新特性,称为扫描集(scanset)。 扫描集定义一个字符集合,可由 scanf() 读入其中允许的字符并赋给对应字符数组。 扫描集合由一对方括号中的一串字符定义,左方括号前必须缀以百分号。 例如,以下的扫描集使 scanf() 读入字符 A、B 和 C:

    %[ABC]

    使用扫描集时,scanf() 连续吃进集合中的字符并放入对应的字符数组,直到发现不在集合中的字符为止(即扫描集仅读匹配的字符)。返回时,数组中放置以 null 结尾、由读入字符组成的字符串。

    用字符 ^ 可以说明补集。把 ^ 字符放为扫描集的第一字符时,构成其它字符组成的命令的补集合,指示 scanf() 只接受未说明的其它字符。

    对于许多实现来说,用连字符可以说明一个范围。 例如,以下扫描集使 scanf() 接受字母 A 到 Z:

    %[A-Z]

    重要的是要注意扫描集是区分大小写的。因此,希望扫描大、小写字符时,应该分别说明大、小写字母。

    scanf() 返回等于成功赋值的域数的值,但由于星号修饰符而读入未赋值的域不计算在内。给第一个域赋值前已出错时,返回 EOF。

    C99 为 scanf() 增加了几个格式修饰符:hh、ll、j、z 和 t。hh 修饰符可用于 d、i、o、u、x、X 或 n。它说明相应的变元是 signed 或 unsigned char 值,或用于 n 时, 相应的变元是指向 long char 型变量的指针。ll 修饰符也可用于 d、i、o、u、x、X 或 n。它说明相应的变元是 signed 或者 unsigned long long int 值。

    j 格式修饰符应用于 d、i、o、u、x、X 或 n,说明匹配的变元是类型 intmax_t 或 uintmax_t。这些类型在 ; 中声明,并说明最大宽度的整数。

    z 格式修饰符应用于 d、i、o、u、x、X 或 n,说明匹配的变元是指向 size_t 类型对象的指针。该类型在 ; 中声明,并说明 sizeof 的结构。

    t 格式修饰符应用于 d、i、o、u、x、X 或 n,说明匹配的变元是指向 ptrdiff_t  类型对象的指针。该类型在 ; 中声明,并说明两个指针之间的差别。

    例子:

    # include ;

    int main( void )

    {

    char str[80], str2[80];

    int i;

    /* read a string and a integer */

    scanf( "%s%d", str, &i );

    /* read up to 79 chars into str */

    scanf( "%79s", str );

    /* skip the integer between the two strings */

    scanf( "%s%*d%s", str, str2 );

    return 0;

    }

    展开全文
  • C语言 sscanf用法详解

    2021-05-25 02:00:31
    /* sscanf用法详解 */#include /* sscanf头文件 */#include #include /*sscanf 读取格式化的字符串中的数据。swscanf 是 sscanf 的宽字符版本;swscanf 的参数是宽字符串。 swscanf不处理 Unicode 全角十六进制或...

    /* sscanf用法详解 */

    #include /* sscanf头文件 */

    #include

    #include

    /*

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

    swscanf 是 sscanf 的宽字符版本;swscanf 的参数是宽字符串。 swscanf不处理 Unicode 全角十六进制或"兼容性区"字符。 除此以外,swscanf 和 sscanf 的行为完全相同。

    函数语法

    int sscanf(const char *str, const char *format, ...);

    参数

    str

    输入源固定字符串

    format

    格式化参数,format可以是一个或多个 {%[*] [width] [{h | l | I64 | L}]type | ' ' | '/t' | '/n' | 非%符号}

    */

    void test()

    {

    /*

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

    const char *p1 = "abcd123";

    char buf1[32] = { 0 };

    sscanf(p1, "%*[a-z]%s", buf1); //跳过字母

    printf("-- buf1[%s]--\n", buf1);

    //[a|b|c]表示a,b,c中选一

    const char *p2 = "3b";

    char buf2_1[32] = { 0 };

    char buf2_2[32] = { 0 };

    sscanf(p2, "%[1|2|3]%c", buf2_1, buf2_2); //或运算符使用

    printf("-- buf1[%s]--buf2_2[%s]---\n", buf2_1, buf2_2);

    //[d],表示可以有d也可以没有d。

    const char *p3 = "b";

    char buf3_1[32] = { 0 };

    char buf3_2[32] = { 0 };

    sscanf(p3, "%[3]%c", buf3_1, buf3_2); //无法提取任何数据

    printf("-- buf1[%s]--buf2_2[%s]---\n", buf3_1, buf3_2);

    //[d],表示可以有d也可以没有d。

    const char *p4 = "b";

    char buf4_1[32] = { 0 };

    char buf4_2[32] = { 0 };

    sscanf(p4, "%c%[3]", buf4_1, buf4_2); //可以正常提取b

    printf("-- buf1[%s]--buf2_2[%s]---\n", buf4_1, buf4_2);

    //结论:sscanf提取字符串必须知道字符串的具体格式,使用上不如正则灵活

    //width表示读取宽度。

    const char *p5 = "abcdef123";

    char buf5_1[32] = { 0 };

    char buf5_2[32] = { 0 };

    sscanf(p5, "%3s%s", buf5_1, buf5_2); //%3s 表示提取3个字符的字符串

    printf("-- buf1[%s]--buf2_2[%s]---\n", buf5_1, buf5_2);

    // h|I|I64 是配合%d提取整数使用 L 是配合%f提取浮点数使用,h表示short类型数据,I表示int类型数据,I64表示长整型数据

    const char *p6 = "123578abc";

    int buf6_1;

    char buf6_2[32] = { 0 };

    sscanf(p6, "%Id%s", &buf6_1, buf6_2);

    printf("-- buf1[%d]--buf2_2[%s]---\n", buf6_1, buf6_2);

    //控制字符

    // %c 一个单一的字符

    // %d 一个十进制整数

    // %i 一个整数

    // %e, %f, %g 一个浮点数

    // %o 一个八进制数

    // %s 一个字符串

    // %x 一个十六进制数

    // %p 一个指针

    // %n 一个等于读取字符数量的整数

    // %u 一个无符号整数

    // %[] 一个字符集

    // %% 一个精度符号

    const char *p7 = "123578abc";

    char ch7 = 0;

    char buf7_2[32] = { 0 };

    sscanf(p7, "%c%s", &ch7, buf7_2);

    printf("-- buf1[%c]--buf2_2[%s]---\n", ch7, buf7_2);

    //sscanf函数遇到空格停止读取字符串,所有需要特地注明空格

    const char *p8 = "123 578a bc";

    char buf8_1[32] = { 0 };

    char buf8_2[32] = { 0 };

    sscanf(p8, "%s%*[ ]%s", buf8_1,buf8_2); //格式化里有空格,可以提取

    printf("-- buf1[%s]--buf2_2[%s]---\n", buf8_1, buf8_2);

    //^ 取到指定字符为止的字符串

    const char *p9 = "123abc";

    char buf9_1[32] = { 0 };

    char buf9_2[32] = { 0 };

    sscanf(p9, "%[^2]%s", buf9_1,buf9_2);

    printf("-- buf1[%s]--buf2_2[%s]---\n", buf9_1, buf9_2);

    //截取到指定字符串 "3ab"

    const char *p10 = "12-3ab-c";

    char buf10_1[32] = { 0 };

    char buf10_2[32] = { 0 };

    sscanf(p10, "%*[^-]-%[^-]%s", buf10_1, buf10_2);

    printf("-- buf1[%s]--buf2_2[%s]---\n", buf10_1, buf10_2);

    */

    //%n的使用,返回前一个提取字符个数,一般

    const char *p11 = "12345dfg";

    int num = 0;

    sscanf(p11, "%*d%n%*s", &num);

    printf("-- buf1[%d]--buf2[%s]--\n", num, p11 num);//注意其用法,节省内存,通过偏移量展示字符串

    }

    int main()

    {

    test();

    printf("-----ok------\n");

    getchar();

    return 0;

    }

    来源:http://www.icode9.com/content-4-156251.html

    展开全文
  • sscanf()函数的使用详解】在看ineedle代码的时候,看到一个C函数sscanf(), 挺熟悉,也觉得挺简单的一个函数,但是此时我愣住了:看到这样的代码: sscanf(szLine,"%[0-9|_|-|a-z|A-Z|&|*]",szTemp);/**********...
  • sscanf之模式匹配

    2021-07-31 17:53:36
    接上一篇文章,笔者给大家介绍一个更加简单的解析工具,那就是sscanf。 热身 大家在上C语言课,做C语言课程设计或实验时,应该经常接触printf和scanf,前者打印字符中到标准输出,而后者从标准输入读取并解析字符串...
  • sscanf函数的高级用法

    2012-08-26 16:39:43
    sscanf函数的高级用法,在C程序中我们往往用它实现对各种复杂格式字符串的处理(解析),配合sprintf
  • sscanfsscanf_s使用方法

    千次阅读 2018-06-03 22:12:42
     定义函数 int sscanf (const char *str,const char * format,........);函数说明 sscanf()会将参数str的字符串根据参数format字符串来转换并格式化数据。格式转换形式请参考scanf()。转换后的结果存于对应的参数...
  • scanf,sscanf高级用法

    2020-12-20 01:59:09
    最近遇到了解析配置的问题,用正规表达式感觉大题小做,使用sscanf因只会用基本用法,感觉功能不够,上网搜了下,解析起来不费吹灰之力,代码也很简洁。原帖出处不详,网上到处是,我做了点修改名称:sscanf() - 从一...
  • sscanf函数用法详解

    2020-12-20 01:59:16
    sscanf() - 从一个字符串中读进与指定格式相符的数据.函数原型:Int sscanf( string str, string fmt, mixed var1, mixed var2 ... );int scanf( const char *format [,argument]... );说明:sscanf与scanf类似,都是...
  • linux sscanf_s

    2021-05-12 09:59:47
    //if条件表示,有三个参数,on的值只能是0或者1,led_no的值只能是0-3 //sscanf的返回值为0,出错,否则返回正确格式化数据的个数,这样就确保main参数每个都读的争取 if (argc != 3 || sscanf(argv[1], "%d", &led...
  • C语言中sscanf的用法

    2021-05-19 04:51:49
    C语言中sscanf的用法C语言是一种计算机程序设计语言,它既具有高级语言的特点,又具有汇编语言的特点。下面是小编为大家整理的C语言中sscanf的.用法,欢迎参考~名称:sscanf() - 从一个字符串中读进与指定格式相符的...
  • sscanf函数的用法

    2021-04-20 06:40:51
    你可以用atoi或者sscanf函数把这......MATLAB读写函数一些使用说明_计算机软件及应用_IT/计算机_专业资料。Ch...scanf 很危险 使用精度说明符,或自己进行解析。 sscanf 很危险 使用精度说明符,或自己进行...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 35,174
精华内容 14,069
关键字:

sscanf

友情链接: keil_nice.rar