打印

开发中的scanf与sscanf函数的应用与讨论

[复制链接]
1062|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tongbu2015|  楼主 | 2016-9-27 21:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如题,
函数原型:

Int sscanf( const char * src, const char * format, ...);
int scanf( const char * format, ...);
这两个函数很相似,只是第一个函数以src作为输入,而第二个函数以标准输入STDIN读取输入;
沙发
tongbu2015|  楼主 | 2016-9-27 21:33 | 只看该作者
原型中,,
format 是格式控制字符串,它包含控制字符(如:%d,%i,%s等),空白字符(如:空格、制表符\t、回车换行符\n 或其连续组合)以及非空白字符;
...是一组指针变量,是上述函数用来保存结果值的;
返回值为被成功赋值的指针变量的个数,如果该函数发生错误,则返回EOF(-1)。

格式控制format:

format可以是一个或多个 {%[*] [width] [{h | l | I64 | L}]type | 空白字符| 非空白符号}

使用特权

评论回复
板凳
tongbu2015|  楼主 | 2016-9-27 21:35 | 只看该作者
具体的用法用例程来说明的:
const char sourceStr[] = "hello, world";  
char buf[10] = ;  
sscanf(sourceStr, "%*s%s", buf); //%*s表示第一个匹配到的%s被过滤掉,即hello被过滤了  
cout << buf<< endl;  
结果为:world  
对比这个:
const char sourceStr[] = "hello, world";  

char buf[10] = ;  

sscanf(sourceStr, "%5s", buf); //%5s,只取5个字符  

cout << buf<< endl;  

结果为:hello  

使用特权

评论回复
地板
tongbu2015|  楼主 | 2016-9-27 21:36 | 只看该作者
上边参数中——
width:宽度,一般可以忽略;
{h | l | I64 | L}:参数的size,通常h表示单字节size,I表示2字节 size,L表示4字节size(double例外),l64表示8字节size;
type:即为控制字符如:d, i, f, s, p, 及集合[ ],(注意%号写在了最前面了,这里不能再加一个%号了。)  需特别注意和说明的控制符是集合%[ ]:
%[a-z] 表示匹配a到z中任意字符,贪婪性(尽可能多的匹配)  
%[aB'] 匹配a、B、'中一员,贪婪性  
%[^a] 匹配非a的任意字符,贪婪性

使用特权

评论回复
5
tongbu2015|  楼主 | 2016-9-27 21:37 | 只看该作者
再结合实例讲解与理解的
sscanf("123456 abcdedf", "%[^ ]", buf);  
printf("%s\n", buf);  
结果为:123456  
const char* s = "iios/12DDWDFF@122";  
char buf[20];  
sscanf( s, "%*[^/]/%[^@]", buf );  
printf( "%s\n", buf );  
结果为:12DDWDFF

使用特权

评论回复
6
tongbu2015|  楼主 | 2016-9-27 21:38 | 只看该作者
好了,其他一些用法的及实例的大家也可以参照网上的好号学习下的

使用特权

评论回复
7
vibra2016| | 2016-9-27 22:35 | 只看该作者
这两函数是有区别的,在C++与C语言实现上都有区别的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

25

主题

1943

帖子

2

粉丝