- 浏览: 495030 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
jkxydp:
算法运行的结果根本就不对。
BM算法. -
soarwindzhang:
感谢博主的分享,我今天看了您的UFSET非递归的路径压缩时感觉 ...
并查集 -
zhangning290:
楼主好像只考虑了坏字符规则,。没有考虑好后缀
BM算法. -
lsm0622:
文字描述有错误 误导新学者
求有向图的强连通分量(scc):Tarjan算法 -
knightchen:
博主,你太强了!这篇文章对我学习C++多线程很有帮助!谢谢
并发学习之一_windows下ZThread在CodeBlocks上的安装与配置
此文所有的实验都是基于下面的程序:
char str[10];
for (int i = 0; i < 10; i++) str[i] = '!';
执行完后str的值为
str = "!!!!!!!!!!"
我们把str的每个字符都初始化为惊叹号,当str的值发生变化时,使用printf打印str的值,对比先前的惊叹号,这样就可以方便的观察str发生了怎样的变化。下面我们做几个小实验,看看使用sscanf和正则表达式格式化输入后,str有什么变化。
实验1:
sscanf("123456","%s",str); ---------str的值为 "123456\0!!!"
这个实验很简单,把源字符串"123456"拷贝到str的前6个字符,并且把str的第7个字符设为null字符,也就是\0
实验2:
sscanf("123456","%3s",str); ---------str的值为 "123\0!!!!!!"
看到没有,正则表达式的百分号后面多了一个3,这告诉sscanf只拷贝3个字符给str,然后把第4个字符设为null字符。
实验3:
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字符。
实验4:
sscanf("AAAaaaBBB","%[^a-z]",str); ---------str的值为 "AAA\0!!!!!!"
对于所有字符,只要不是小写字母,都满足"^a-z"正则表达式,符号^表示逻辑非。前3个字符都不是小写字符,所以将其拷贝给str,但最后3个字符也不是小写字母,为什么不拷贝给str呢?这是因为当碰到不满足条件的字符后,sscanf就会停止执行,不再扫描之后的字符。
实验5:
sscanf("AAAaaaBBB","%[A-Z]%[a-z]",str); ---------段错误
这个实验的本意是:先把大写字母拷贝给str,然后把小写字母拷贝给str,但很不幸,程序运行的时候会发生段错误,因为当sscanf扫描到字符a时,违反了条件"%[A-Z]",sscanf就停止执行,不再扫描之后的字符,所以第二个条件也就没有任何意义,这个实验说明:不能使用%号两次或两次以上
实验6:
sscanf("AAAaaaBBB","%*[A-Z]%[a-z]",str); ---------str的值为 "aaa\0!!!!!!"
这个实验出现了一个新的符号:%*,与%相反,%*表示过滤满足条件的字符,在这个实验中,%*[A-Z]过滤了所有大写字母,然后再使用%[a-z]把之后的小写字母拷贝给str。如果只有%*,没有%的话,sscanf不会拷贝任何字符到str,这时sscanf的作用仅仅是过滤字符串。
实验7:
sscanf("AAAaaaBBB","%[a-z]",str); ---------str的值为 "!!!!!!!!!!"
做完前面几个实验后,我们都知道sscanf拷贝完成后,还会在str的后面加上一个null字符,但如果没有一个字符满足条件,sscanf不会在str 的后面加null字符,str的值依然是10个惊叹号。这个实验也说明了,如果不使用%*过滤掉前面不需要的字符,你永远别想取得中间的字符。
实验8:
sscanf("AAAaaaBC=","%*[A-Z]%*[a-z]%[^a-z=]",str); ---------str的值为 "BC\0!!!!!!!"
这是一个综合实验,但这个实验的目的不是帮我们复习前面所学的知识,而是展示两个值得注意的地方:
注意1:%只能使用一次,但%*可以使用多次,比如在这个实验里面,先用%*[A-Z]过滤大写字母,然后用%*[a-z]过滤小写字母。
注意2:^后面可以带多个条件,且这些条件都受^的作用,比如^a-z=表示^a-z且^=(既不是小写字母,也不是等于号)。
实验9:
int k;
sscanf("AAA123BBB456", "%*[^0-9]%i", &k); ---------k的值为123
首先,%*[^0-9]过滤前面非数字的字符,然后用%i把数字字符转换成int型的整数,拷贝到变量k,注意参数必须使用k的地址。
仍段代码下来:
char str[10];
for (int i = 0; i < 10; i++) str[i] = '!';
执行完后str的值为
str = "!!!!!!!!!!"
我们把str的每个字符都初始化为惊叹号,当str的值发生变化时,使用printf打印str的值,对比先前的惊叹号,这样就可以方便的观察str发生了怎样的变化。下面我们做几个小实验,看看使用sscanf和正则表达式格式化输入后,str有什么变化。
实验1:
sscanf("123456","%s",str); ---------str的值为 "123456\0!!!"
这个实验很简单,把源字符串"123456"拷贝到str的前6个字符,并且把str的第7个字符设为null字符,也就是\0
实验2:
sscanf("123456","%3s",str); ---------str的值为 "123\0!!!!!!"
看到没有,正则表达式的百分号后面多了一个3,这告诉sscanf只拷贝3个字符给str,然后把第4个字符设为null字符。
实验3:
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字符。
实验4:
sscanf("AAAaaaBBB","%[^a-z]",str); ---------str的值为 "AAA\0!!!!!!"
对于所有字符,只要不是小写字母,都满足"^a-z"正则表达式,符号^表示逻辑非。前3个字符都不是小写字符,所以将其拷贝给str,但最后3个字符也不是小写字母,为什么不拷贝给str呢?这是因为当碰到不满足条件的字符后,sscanf就会停止执行,不再扫描之后的字符。
实验5:
sscanf("AAAaaaBBB","%[A-Z]%[a-z]",str); ---------段错误
这个实验的本意是:先把大写字母拷贝给str,然后把小写字母拷贝给str,但很不幸,程序运行的时候会发生段错误,因为当sscanf扫描到字符a时,违反了条件"%[A-Z]",sscanf就停止执行,不再扫描之后的字符,所以第二个条件也就没有任何意义,这个实验说明:不能使用%号两次或两次以上
实验6:
sscanf("AAAaaaBBB","%*[A-Z]%[a-z]",str); ---------str的值为 "aaa\0!!!!!!"
这个实验出现了一个新的符号:%*,与%相反,%*表示过滤满足条件的字符,在这个实验中,%*[A-Z]过滤了所有大写字母,然后再使用%[a-z]把之后的小写字母拷贝给str。如果只有%*,没有%的话,sscanf不会拷贝任何字符到str,这时sscanf的作用仅仅是过滤字符串。
实验7:
sscanf("AAAaaaBBB","%[a-z]",str); ---------str的值为 "!!!!!!!!!!"
做完前面几个实验后,我们都知道sscanf拷贝完成后,还会在str的后面加上一个null字符,但如果没有一个字符满足条件,sscanf不会在str 的后面加null字符,str的值依然是10个惊叹号。这个实验也说明了,如果不使用%*过滤掉前面不需要的字符,你永远别想取得中间的字符。
实验8:
sscanf("AAAaaaBC=","%*[A-Z]%*[a-z]%[^a-z=]",str); ---------str的值为 "BC\0!!!!!!!"
这是一个综合实验,但这个实验的目的不是帮我们复习前面所学的知识,而是展示两个值得注意的地方:
注意1:%只能使用一次,但%*可以使用多次,比如在这个实验里面,先用%*[A-Z]过滤大写字母,然后用%*[a-z]过滤小写字母。
注意2:^后面可以带多个条件,且这些条件都受^的作用,比如^a-z=表示^a-z且^=(既不是小写字母,也不是等于号)。
实验9:
int k;
sscanf("AAA123BBB456", "%*[^0-9]%i", &k); ---------k的值为123
首先,%*[^0-9]过滤前面非数字的字符,然后用%i把数字字符转换成int型的整数,拷贝到变量k,注意参数必须使用k的地址。
仍段代码下来:
#if 0 1,sscanf():从一个字符串中读进与指定格式相符的数据. 2,sscanf与scanf类似,都是用于输入的,只是后者以屏幕(stdin)为输入源,前者以固定字符串为输入源。 3,关于正则表达式: (1)%[..],当字符属于方括号里表达式表示的字符集时继续读取,否则停止.方括号里的和正则表达式差不多,^是"排除..."的意思 (2)%*[..],直接跳过方括号里的字符集并继续读取 #endif #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,然后把小写字母拷贝给str,但很不幸,程序运行的时候会发生段错误,因为当sscanf扫描到字符a时,违反了条件"%[A-Z]",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; }
发表评论
-
C语言中的不定参数
2010-12-15 12:28 130041,最近刚刚知道C语言还有不定参数这么个东东。 2,解决方法 ... -
剖析浮点数
2010-12-10 10:39 1101[转载]http://blog.csdn.net/masefe ... -
存在虚基类时,类对象的大小
2010-12-09 19:38 11531, 实例代码: #include <iostrea ... -
关于父类的构造的顺序
2010-12-09 19:33 6051,没有虚基类的情况: #include <iost ... -
关于empty class的大小
2010-12-09 19:32 10591,首先简要说明下为什么empty class的大小不是0? ... -
JVM实现机制及内部基本概念
2010-12-09 19:27 802兴趣所致,搜了一些关于JVM的简单介绍,算是扫盲吧。 1.J ... -
指向对象成员变量的指针。
2010-12-09 19:18 10771,工作定了后,把《Inside the C++ object ... -
面向对象的一些常见问题总结。
2010-12-09 19:08 8651,构造函数中调用虚函数的问题。 注:一般编译器都会在执行完b ... -
关于C++的名字查找规则
2010-12-09 19:05 13111,总结一句话:由内向外,找到合适的即刻停止。 实例代码: ... -
继承下的名字查找规则,最近作用域
2010-11-06 20:04 8311, #include <iostream> ... -
虚基类和多重继承总结
2010-11-06 19:54 8071,虚基类,其构造函数总是在最后一个层次最先并且真正被执行。 ... -
为什么构造函数,不能是virtual?
2010-09-25 15:24 16151,C++语言是静态语言,而把构造函数写成虚函数意味这可以动态 ... -
大小端对应字节, 注意和一个字节内位序的区分
2010-09-09 10:11 13551,一个例子: #include <stdio.h& ... -
实现:不能被继承的类
2010-08-31 17:35 7941,首先想到的是在C++ 中 ... -
提升为N的倍数(N为2的指数次)
2010-07-18 10:16 7121,可以这么做: int num=15; num = (num ... -
C++ 中:new的用法
2010-07-17 16:26 1849先放这儿,有时间了,在 ... -
句柄的使用实例
2010-06-02 11:24 11051,这个实例采用了使用计数策略. 2,实例代码: #in ... -
关于类的一些语法:
2010-06-02 09:26 658所谓"书越读越薄",这话说得真是有道理. ... -
sizeof(string对象)的大小
2010-06-01 11:32 14841,无语了,string对象的大小固定就是4啊. 2,实例代码 ... -
C语言中不同增值语句的区别
2010-05-12 12:50 6181, mango[i++]+=y; 被当作 mango[i]= ...
相关推荐
每种语言都对正则表达式有着不同程度的支持,在C语言中,有输入功能的这三个函数对正则表达式的支持并不强大,但是我们还是有必要了解一下。 首先来看看他们的原型: #include int scanf(const char *format, ...)...
详细的c语言正则表达式用法,sscanf的正则表达不会用的必看
废话不多说了,直接给大家贴代码了,具体代码如下所示: ...// 测试sscanf 和 正则表达式 // sscanf提供的这个扩展功能其实并不能真正称为正则表达式,因为他的书写还是离不开% // []表示字符范围,{}表示重复次数
sscanf函数的高级用法 sscanf函数的高级用法 sscanf函数的高级用法 sscanf函数的高级用法
http://blog.csdn.net/sismvg/article/details/9123689 看这篇文章
sscanf 正则表达式 format, 非常不错的资源,可以再也不用太担心sscanf的用法了
详细介绍sscanf函数的用法, 一看必然会用。。。。。。。
sscanf函数的高级用法,非常好的资料,由KLC搜集整理,不敢独享,大家都来下载吧
sscanf函数.pdf
sscanf函数的用法.pdf
重要知识sscanf函数.pdf
计算机sscanf函数的用法.pdf
sscanf函数的用法[定义].pdf
sscanf函数的用法[文].pdf
C语言或者C++ 中的sscanf的一些操作练习进行详解,一般用来分割字符串; 如固定格式的ch = "\"aa bb cc\" \"dd ff gg\"";
sscanf与scanf类似,都是用于输入的,只是后者以键盘(stdin)为输入源,前者以固定字符串为输入源。但是有点类似于正则表达式
sscanf函数的范例的用法和实例,使人尽快掌握sscanf的用法。