注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

告别迷茫

梦想与现实的差距,就是我们生活的意义。因为我们有差距,我们才会一直积累,在努力。

 
 
 

日志

 
 

string 对象与 sscanf 函数  

2014-03-16 23:25:42|  分类: ACM学习小结 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
在 C 语言中,sscanf 函数很管用,它可以把一个字符串按你需要的方式分离出子串,
甚至是数字。下面这个程序演示了 sscanf 函数的具体用法
#include <string>
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
string s1,s2,s3;
char sa[100],sb[100],sc[100];
//将字符串分离成子串,分隔符为空格
sscanf("abc 123 pc","%s %s %s",sa,sb,sc);
s1=sa;
s2=sb;
s3=sc;
cout<<s1<<" "<<s2<<" "<<s3<<endl;
//将字符串分离成数字,分隔符为空格
//当用到数字的时候,跟 scanf 一样,它要传指针地址
int a,b,c;
sscanf("1 2 3","%d %d %d",&a,&b,&c);
cout<<a<<" "<<b<<" "<<c<<endl;
//将字符串分离成数字,分隔符为“,”和“$”
//当用到数字的时候,跟 scanf 一样,它要传指针地址
int x,y,z;
sscanf("4,5$6","%d,%d$%d",&x,&y,&z);
cout<<x<<" "<<y<<" "<<z<<endl;
return 0;
}
C语言里sscanf函数的正则表达式
fusky2011-06-26 18:58:19
阅读:219
标签:c语言sscanf函数it
一、说明:
1、sscanf():从一个字符串中读进与指定格式相符的数据.
2、sscanf与scanf类似,都是用于输入的,只是后者以屏幕(stdin)为输入源,前者以固定字符串为输入源。
二、控制sscanf函数变量接收值的控制字符
1、%[..],当字符属于方括号里表达式表示的字符集时继续读取,否则停止.方括号里的和正则表达式差不多,^是'排除...'的意思
2、%*[..],直接跳过方括号里的字符集并继续读取
三、举例
#include <iostream>
using namespace std;
int main()
{ char str[10];
for (int i = 0; i < 10; i++)
str[i] = '!';
cout<<str<<endl;
sscanf('123456','%s',str);//---------str的值为 '123456\0!!!'
//这个实验很简单,把源字符串'123456'拷贝到str的前6个字符,并且把str的第7个字符设为null字符,也就是\0
cout<<str<<endl;
for (int i = 0; i < 10; i++)
str[i] = '!';
sscanf('123456','%3s',str); //---------str的值为 '123\0!!!!!!'
//看到没有,正则表达式的百分号后面多了一个3,这告诉sscanf只拷贝3个字符给str,然后把第4个字符设为null字符。
cout<<str<<endl;
for (int i = 0; i < 10; i++)
str[i] = '!';
sscanf('aaaAAA','%[a-z]',str);// ---------str的值为 'aaa\0!!!!!!'
//从这个实验开始我们会使用正则表达式,括号里面的a-z就是一个正则表达式,它可以表示从a到z的任意字符,
//在继续讨论之前,我们先来看看百分号表示什么意思,%表示选择,%后面的是条件,比如实验1的'%s',s是一个条件,表示任意字符,'%s'的意思是:只要输入的东西是一个字符,就把它拷贝给str。实验2的'%3s'又多了一个条件:只拷贝3个字符。实验3的“%[a-z]”的条件稍微严格一些,输入的东西不但是字符,还得是一个小写字母的字符,所以实验3只拷贝了小写字母'aaa'给str,别忘了加上null字符。
cout<<str<<endl;
for (int i = 0; i < 10; i++)
str[i] = '!';
sscanf('AAAaaaBBB','%[^a-z]',str);// ---------str的值为 'AAA\0!!!!!!'
//对于所有字符,只要不是小写字母,都满足'^a-z'正则表达式,符号^表示逻辑非。前3个字符都不是小写字符,所以将其拷贝给str,但最后3个字符也不是小写字母,为什么不拷贝给str呢?这是因为当碰到不满足条件的字符后,sscanf就会停止执行,不再扫描之后的字符。
cout<<str<<endl;
for (int i = 0; i < 10; i++)
str[i] = '!';
sscanf('AAAaaaBBB','%*[A-Z]%[a-z]',str); //---------str的值为 'aaa\0!!!!!!'
//这个实验出现了一个新的符号:%*,与%相反,%*表示过滤满足条件的字符,在这个实验中,%*[A-Z]过滤了所有大写字母,然后再使用%[a-z]把之后的小写字母拷贝给str。如果只有%*,没有%的话,sscanf不会拷贝任何字符到str,这时sscanf的作用仅仅是过滤字符串。
cout<<str<<endl;
for (int i = 0; i < 10; i++)
str[i] = '!';
sscanf('AAAaaaBBB','%[a-z]',str);// ---------str的值为 '!!!!!!!!!!'
//做完前面几个实验后,我们都知道sscanf拷贝完成后,还会在str的后面加上一个null字符,但如果没有一个字符满足条件,sscanf不会在str 的后面加null字符,str的值依然是10个惊叹号。这个实验也说明了,如果不使用%*过滤掉前面不需要的字符,你永远别想取得中间的字符。
cout<<str<<endl;
for (int i = 0; i < 10; i++) str[i] = '!';
sscanf('AAAaaaBC=','%*[A-Z]%*[a-z]%[^a-z=]',str); //---------str的值为 'BC\0!!!!!!!'
//这是一个综合实验,但这个实验的目的不是帮我们复习前面所学的知识,而是展示两个值得注意的地方:
//注意1:%只能使用一次,但%*可以使用多次,比如在这个实验里面,先用%*[A-Z]过滤大写字母,然后用%*[a-z]过滤小写字母。
// 注意2:^后面可以带多个条件,且这些条件都受^的作用,比如^a-z=表示^a-z且^=(既不是小写字母,也不是等于号)。
cout<<str<<endl;
for (int i = 0; i < 10; i++)
str[i] = '!';
int k;
sscanf('AAA123BBB456', '%*[A-Z]%i', &k); //---------k的值为123
//首先,%*[^0-9]过滤前面非数字的字符,然后用%i把数字字符转换成int型的整数,拷贝到变量k,注意参数必须使用k的地址。
cout<<str<<endl;
cout<<k<<endl;
return 0;
}
  评论这张
 
阅读(11)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017