sscanf
名称:
sscanf()- 从一个字符串中读进与指定格式相符的数据.
函数原型:
Intsscanf( string str, string fmt, mixed var1, mixed var2 ... );
intscanf( 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. 常见用法。
charbuf[512] = ;
sscanf("123456", "%s", buf);
printf("%c\n",buf);[微软用户1]
结果为:123456
2. 取指定长度的字符串。如在下例中,取最大长度为4字节的字符串。
sscanf("123456", "%4s", buf);
printf("%s\n",buf);
结果为:1234
3. 取到指定字符为止的字符串。如在下例中,取遇到空格为止字符串。
sscanf("123456abcdedf", "%[^ ]", 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是一个运行时函数,原形很简单:
intsscanf(
constchar *buffer,
constchar *format [,
argument] ...
);
它强大的功能体现在对format的支持上。
我以前用它来分隔类似这样的字符串2006:03:18:
inta, b, c;
sscanf("2006:03:18","%d:%d:%d", a, b, c);
以及2006:03:18- 2006:04:18:
charsztime1[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中有%[]这样的typefield。如果读取的字符串,不是以空格来分隔的话,就可以使用%[]。
%[]类似于一个正则表达式。[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真棒,现做一总结。
原问题:
iios/12DDWDFF@122
获取/和@之间的字符串怎么做
C程序里面有什么函数吗?
周星星的代码:
#include
intmain()
{
constchar* s = "iios/12DDWDFF@122";
charbuf[20];
sscanf(s, "%*[^/]/%[^@]", buf );
printf("%s\n", buf );
return0;
}
结果为:12DDWDFF
sscanf与scanf类似,都是用于输入的,只是后者以屏幕(stdin)为输入源,前者以固定字符串为输入源。
函数原型:
intscanf( const char *format [,argument]... );
其中的format可以是一个或多个 {%[*] [width] [{h | l | I64 | L}]type | ' ' | '\t' |'\n' | 非%符号},
注:{a|b|c}表示a,b,c中选一,[d],表示可以有d也可以没有d。
width:宽度,一般可以忽略,用法如:
constchar sourceStr[] = "hello, world";
charbuf[10] = ;
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。
type:这就很多了,就是%s,%d之类。
特别的:
%*[width][{h | l | I64 | L}]type 表示满足该条件的被过滤掉,不会向目标参数中写入值。如:
constchar sourceStr[] = "hello, world";
charbuf[10] = ;
sscanf(sourceStr,"%*s%s", buf); //%*s表示第一个匹配到的%s被过滤掉,即hello被过滤了
cout<< buf<< endl;
结果为:world
支持集合操作:
%[a-z]表示匹配a到z中任意字符,贪婪性(尽可能多的匹配)
%[aB']匹配a、B、'中一员,贪婪性
%[^a]匹配非a的任意字符,贪婪性
是不是感觉眼熟了啊,不错,这和正则表达式很相似,而且仍然支持过滤,即可以有%*[a-z].如:
星星大哥例子回顾:
constchar* s = "iios/12DDWDFF@122";
charbuf[20];
sscanf(s, "%*[^/]/%[^@]", buf );
printf("%s\n", buf );
由例子3-》取到指定字符为止的字符串。如在下例中,取遇到空格为止字符串。
sscanf("123456abcdedf", "%[^ ]", buf);
printf("%s\n",buf);
结果为:123456
所以周星星的代码总结应该为:
constchar* s = "iios/12DDWDFF@122";
charbuf[20];
sscanf(s, "%*[^/]/%[^@]", buf );
printf("%s\n", buf );
先将"iios/"过滤掉,再将到字符'@'为止的一串12DDWDFF(由例3可得此串到@为止,把@122舍掉)内容即是:12DDWDFF送到buf中,得到结果。
PS: 向星星大哥和softmse (Jake) 致谢了,有了你们才有它啊
sscanf()什么意思
悬赏分:0 - 解决时间:2007-10-1221:05
#include
#include
void main()
{
char str[]="32700";
int x;
sscanf(&str[0],"%d",&x);
printf("%d",x-'0');
}
提问者: xiuye1987 - 千总 四级
最佳答案
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真棒,现做一总结。
原问题:
iios/12DDWDFF@122
获取/和@之间的字符串怎么做
C程序里面有什么函数吗?
周星星的代码:
#include
int main()
{
const char* s = "iios/12DDWDFF@122";
char buf[20];
sscanf( s, "%*[^/]/%[^@]", buf );
printf( "%s\n", buf );
return 0;
}
结果为:12DDWDFF
sscanf与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。
type :这就很多了,就是%s,%d之类。
特别的:
%*[width] [{h | l | I64 | L}]type 表示满足该条件的被过滤掉,不会向目标参数中写入值。如:
const char sourceStr[] = "hello, world";
char buf[10] = {0};
sscanf(sourceStr, "%*s%s", buf); //%*s表示第一个匹配到的%s被过滤掉,即hello被过滤了
cout << buf<< endl;
结果为:world
支持集合操作:
%[a-z] 表示匹配a到z中任意字符,贪婪性(尽可能多的匹配)
%[aB'] 匹配a、B、'中一员,贪婪性
%[^a] 匹配非a的任意字符,贪婪性
是不是感觉眼熟了啊,不错,这和正则表达式很相似,而且仍然支持过滤,即可以有%*[a-z].如:
星星大哥例子回顾:
const char* s = "iios/12DDWDFF@122";
char buf[20];
sscanf( s, "%*[^/]/%[^@]", buf );
printf( "%s\n", buf );
先将 "iios/"过滤掉,再将非'@'的一串内容送到buf中,cool.得到结果。
PS: 向星星大哥和softmse (Jake) 致谢了,有了你们才有它啊
sscanf()的用法和例子
2009-06-12 16:03
这里有些sscanf()的一些使用说明,都是从论坛,Blog里整理出来的。供大家使用。 名称:sscanf() - 从一个字符串中读进与指定格式相符的数据. 说明: 支持集合操作: 例子: 2. 取指定长度的字符串。如在下例中,取最大长度为4字节的字符串。 3. 取到指定字符为止的字符串。如在下例中,取遇到空格为止字符串。 4. 取仅包含指定字符集的字符串。如在下例中,取仅包含1到9和小写字母的字符串。 5. 取到指定字符集为止的字符串。如在下例中,取遇到大写字母为止的字符串。 6、给定一个字符串iios/12DDWDFF@122,获取 / 和 @ 之间的字符串,先将 "iios/"过滤掉,再将非'@'的一串内容送到buf中 7、给定一个字符串““hello, world”,仅保留world。(注意:“,”之后有一空格) sscanf(“hello, world”, "%*s%s", buf); 8、分割以某字符标记的字符串。 char test[]="222,333,444,,,555,666"; 一下摘自:http://blog.csdn.net/lbird/archive/2007/08/03/1724429.aspx [ ]内的字符串可以是1或更多字符组成。空字符集(%[])是违反规定的,可 导致不可预知的结果。%[^]也是违反规定的。 %[a-z] 读取在 a-z 之间的字符串,如果不在此之前则停止,如 char s[]="hello, my friend” ; // 注意: ,逗号在不 a-z之间 sscanf( s, “%[a-z]”, string ) ; // string=hello
char s[]="HELLOkitty” ; // 注意: ,逗号在不 a-z之间 sscanf( s, “%[^a-z]”, string ) ; // string=HELLO
char s[]="notepad=1.0.0.1001" ; char szfilename [32] = "" ; int i = sscanf( s, "%*[^=]", szfilename ) ; // szfilename=NULL,因为没保存 int i = sscanf( s, "%*[^=]=%s", szfilename ) ; // szfilename=1.0.0.1001 %40c 读取40个字符 The run-time library does not automatically append a null terminator to the string, nor does reading 40 characters automatically terminate the scanf() function. Because the library uses buffered input, you must press the ENTER key to terminate the string scan. If you press the ENTER before the scanf() reads 40 characters, it is displayed normally, and the library continues to prompt for additional input until it reads 40 characters
char s[]="notepad=1.0.0.1001" ; char szfilename [32] = "" ; int i = sscanf( s, "%[^=]", szfilename ) ; // szfilename=notepad 如果参数格式是:%[^=:] ,那么也可以从 notepad:1.0.0.1001读取notepad
使用例子: char s[]="notepad=1.0.0.1001" ; char szname [32] = "" ; char szver [32] = “” ; sscanf( s, "%[^=]=%s", szname , szver ) ; // szname=notepad, szver=1.0.0.1001 总结:%[]有很大的功能,但是并不是很常用到,主要因为: 1、许多系统的 scanf 函数都有漏洞. (典型的就是 TC 在输入浮点型时有时会出错). 2、用法复杂, 容易出错. 3、编译器作语法分析时会很困难, 从而影响目标代码的质量和执行效率. 个人觉得第3点最致命,越复杂的功能往往执行效率越低下。而一些简单的字符串分析我们可以自已处理。 |
Byte 变量存储为单精度型、无符号整型、8 位(1个字节)的数值形式,范围在 0至 255 之间。
Byte 数据类型在存储二进制数据时很有用。
函数名: atoi
功 能: 把字符串转换成长整型数
用 法: int atoi(const char *nptr);
程序例:
#include
#include
int main(void)
{
int n;
char *str = "12345.67";
n = atoi(str);
printf("string = %s integer = %d\n", str, n);
return 0;
}
|
|
|
|
|
|
|
首 页 |
| |
技术论坛 |
| |
技术文章 |
| |
程序源码 |
| |
合作项目 |
| |
在线教程 |
| |
资料下载 |
| |
读书笔记 |
| |
发布文章 |
| |
RSS |
| |
站点地图 |
|
|
|
|
|
Copyright © 2004-2008 Inc. All rights reserved. |
|
|
|
|
|
|
|
首 页 |
| |
技术论坛 |
| |
技术文章 |
| |
程序源码 |
| |
合作项目 |
| |
在线教程 |
| |
资料下载 |
| |
读书笔记 |
| |
发布文章 |
| |
RSS |
| |
站点地图 |
|
|
|
|
|
|
[微软用户1]将%s变成%c试试