此文所有的实验都是基于下面的程序:

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的地址。

[cpp] view plaincopyprint?
  1. #if 0
  2. 1,sscanf():从一个字符串中读进与指定格式相符的数据.
  3. 2,sscanf与scanf类似,都是用于输入的,只是后者以屏幕(stdin)为输入源,前者以固定字符串为输入源。
  4. 3,关于正则表达式:
  5. (1)%[..],当字符属于方括号里表达式表示的字符集时继续读取,否则停止.方括号里的和正则表达式差不多,^是"排除..."的意思
  6. (2)%*[..],直接跳过方括号里的字符集并继续读取
  7. #endif
  8. #include <iostream>
  9. using namespace std;
  10. int main()
  11. {
  12. char str[10];
  13. for (int i = 0; i < 10; i++) str[i] = '!';
  14. cout<<str<<endl;
  15. sscanf("123456","%s",str);//---------str的值为 "123456\0!!!"
  16. //这个实验很简单,把源字符串"123456"拷贝到str的前6个字符,并且把str的第7个字符设为null字符,也就是\0
  17. cout<<str<<endl;
  18. for (int i = 0; i < 10; i++) str[i] = '!';
  19. sscanf("123456","%3s",str); //---------str的值为 "123\0!!!!!!"
  20. //看到没有,正则表达式的百分号后面多了一个3,这告诉sscanf只拷贝3个字符给str,然后把第4个字符设为null字符。
  21. cout<<str<<endl;
  22. for (int i = 0; i < 10; i++) str[i] = '!';
  23. sscanf("aaaAAA","%[a-z]",str);// ---------str的值为 "aaa\0!!!!!!"
  24. //从这个实验开始我们会使用正则表达式,括号里面的a-z就是一个正则表达式,它可以表示从a到z的任意字符,
  25. //在继续讨论之前,我们先来看看百分号表示什么意思,%表示选择,%后面的是条件,比如实验1的"%s",s是一个条件,表示任意字符,"%s"的意思是:只要输入的东西是一个字符,就把它拷贝给str。实验2的"%3s"又多了一个条件:只拷贝3个字符。实验3的“%[a-z]”的条件稍微严格一些,输入的东西不但是字符,还得是一个小写字母的字符,所以实验3只拷贝了小写字母"aaa"给str,别忘了加上null字符。
  26. cout<<str<<endl;
  27. for (int i = 0; i < 10; i++) str[i] = '!';
  28. sscanf("AAAaaaBBB","%[^a-z]",str);// ---------str的值为 "AAA\0!!!!!!"
  29. //对于所有字符,只要不是小写字母,都满足"^a-z"正则表达式,符号^表示逻辑非。前3个字符都不是小写字符,所以将其拷贝给str,但最后3个字符也不是小写字母,为什么不拷贝给str呢?这是因为当碰到不满足条件的字符后,sscanf就会停止执行,不再扫描之后的字符。
  30. cout<<str<<endl;
  31. /*
  32. for (int i = 0; i < 10; i++) str[i] = '!';
  33. sscanf("AAAaaaBBB","%[A-Z]%[a-z]",str);// ---------段错误
  34. //这个实验的本意是:先把大写字母拷贝给str,然后把小写字母拷贝给str,但很不幸,程序运行的时候会发生段错误,因为当sscanf扫描到字符a时,违反了条件"%[A-Z]",sscanf就停止执行,不再扫描之后的字符,所以第二个条件也就没有任何意义,这个实验说明:不能使用%号两次或两次以上
  35. cout<<str<<endl;
  36. */
  37. for (int i = 0; i < 10; i++) str[i] = '!';
  38. sscanf("AAAaaaBBB","%*[A-Z]%[a-z]",str); //---------str的值为 "aaa\0!!!!!!"
  39. //这个实验出现了一个新的符号:%*,与%相反,%*表示过滤满足条件的字符,在这个实验中,%*[A-Z]过滤了所有大写字母,然后再使用%[a-z]把之后的小写字母拷贝给str。如果只有%*,没有%的话,sscanf不会拷贝任何字符到str,这时sscanf的作用仅仅是过滤字符串。
  40. cout<<str<<endl;
  41. for (int i = 0; i < 10; i++) str[i] = '!';
  42. sscanf("AAAaaaBBB","%[a-z]",str);// ---------str的值为 "!!!!!!!!!!"
  43. //做完前面几个实验后,我们都知道sscanf拷贝完成后,还会在str的后面加上一个null字符,但如果没有一个字符满足条件,sscanf不会在str 的后面加null字符,str的值依然是10个惊叹号。这个实验也说明了,如果不使用%*过滤掉前面不需要的字符,你永远别想取得中间的字符。
  44. cout<<str<<endl;
  45. for (int i = 0; i < 10; i++) str[i] = '!';
  46. sscanf("AAAaaaBC=","%*[A-Z]%*[a-z]%[^a-z=]",str); //---------str的值为 "BC\0!!!!!!!"
  47. //这是一个综合实验,但这个实验的目的不是帮我们复习前面所学的知识,而是展示两个值得注意的地方:
  48. //注意1:%只能使用一次,但%*可以使用多次,比如在这个实验里面,先用%*[A-Z]过滤大写字母,然后用%*[a-z]过滤小写字母。
  49. // 注意2:^后面可以带多个条件,且这些条件都受^的作用,比如^a-z=表示^a-z且^=(既不是小写字母,也不是等于号)。
  50. cout<<str<<endl;
  51. for (int i = 0; i < 10; i++) str[i] = '!';
  52. int k;
  53. sscanf("AAA123BBB456", "%*[A-Z]%i", &k); //---------k的值为123
  54. //首先,%*[^0-9]过滤前面非数字的字符,然后用%i把数字字符转换成int型的整数,拷贝到变量k,注意参数必须使用k的地址。    cout<<str<<endl;
  55. cout<<k<<endl;
  56. return 0;
  57. }

sscanf用法(转)相关推荐

  1. sscanf c语言程序,C语言 sscanf用法详解

    /*sscanf用法详解*/#include /*sscanf头文件*/#include#include /*sscanf 读取格式化的字符串中的数据. swscanf 是 sscanf 的宽字符版本 ...

  2. sscanf用法总结

    2019独角兽企业重金招聘Python工程师标准>>> 使用sscanf来提取字符串中的指定内容, 感觉还不错, 现在在这里做一个总结 注意代码中变量均无定义, 可以根据用法自行定义 ...

  3. sscanf用法详解-hdu2072

    名称: sscanf() - 从一个字符串中读进与指定格式相符的数据. 函数原型: Int sscanf( string str, string fmt, mixed var1, mixed var2 ...

  4. 表达式求值(sscanf用法)(stack练习)(第四届河南省大学生程序设计竞赛)

    题目描述 Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近又学会了一些简单的函数求值,比如,它知道函数min(20,23)的值是20 ,add(10,98) 的值是108等等.经过训练,Dr. ...

  5. sscanf 用法详解

    sscanf 名称: sscanf() - 从一个字符串中读进与指定格式相符的数据. 函数原型: int sscanf( string str, string fmt, mixed var1, mix ...

  6. matlab sscanf用法,sscanf函数的用法

    木之叶舞 - 三级 2009-7-29 02:05 int型的数也会被转成字符型的,比如你输入的是程序名 123 那么argc=2,argv[1]="123".你可以用atoi或者 ...

  7. sscanf用法简介

    1.定义函数 int sscanf (const char *str,const char * format,........); 函数说明 sscanf()会将参数str的字符串根据参数format ...

  8. sscanf用法详解

    sscanf是从字符串中读取指定整型,浮点型及其他指定数据类型的函数 sscanf和scanf的不同是,前者是从字符串中读取.后者是从键盘输入中读取 sscanf的定义 int sscanf (con ...

  9. sscanf一小用法

    背景:欲从FTP服务器下载一文件,须知其大小,使用SIZE命令无效(该命令在RFC959中未出现,即非标准命令).经测试发现RETR命令返回的信息中包含了文件大小,即字节数,现需要将其从字符串中解析出 ...

最新文章

  1. Redis命令——Keys相关
  2. Python小知识点(5)--面向对象部分
  3. python+scapy 抓包与解析
  4. ML之RS:基于用户的CF+LFM实现的推荐系统(基于相关度较高的用户实现电影推荐)
  5. 给你汇报Struts2 S2-016漏洞修复的总结
  6. 运营资源很少的时候,怎么运营自己的产品(完结)
  7. 微信小程序没登录跳到登录页怎么做_微信小程序手机端如何实现登录页面跳转含有Tabar页面...
  8. imx8m开发板资料
  9. C# Attribute(中)——Attribute本质论
  10. 将数据库中一张表中数据复制到另一张表
  11. ubuntu16.04下ROS操作系统学习笔记(七 )机器语音-语音听写-科大讯飞SDK调用
  12. cp、mv、rm、find、mkdir
  13. Zabbix4.0安装教程
  14. 微信公众号推文怎么做?
  15. C++多线程编程实战01:std::thread
  16. iOS10开发哪些坑
  17. 关于“运放“这些知识点
  18. cuteftp连接ubuntu虚拟机
  19. 中兴通讯 软件开发工程师 一二三面
  20. 算法精解 c语言描述 豆瓣,斯坦福大学教授亲授,这本美亚4.7星的算法书,新手程序员都看得懂!...

热门文章

  1. iPad Pro变生产力工具,你还缺这个轻量级浏览器端代码编辑器
  2. 430亿晶体管,1020万逻辑单元,英特尔发布全球最大容量FPGA,用全新硬件加速AI开发...
  3. 入围CVPR最佳论文,这项AI基础研究让我们对虎牙刮目相看
  4. Tomcat学习总结(2)——Tomcat使用详解
  5. 一行代码集成带负数的自定义键盘
  6. 【Andorid X 项目笔记】动态设置ViewPager的Adapter问题(2)
  7. datePicker在fullscreen下不弹出
  8. JAVA (集合和数据结构)
  9. Git教程学习(一)
  10. w10系统没有打开方式_小白怎么制作微软官方win10系统安装启动U盘