sscanf用法

sscanf用法

参考链接1
参考链接2

sscanf来简单的提取用空格隔起来的字符串
int sscanf (const char *str,const char * format,........); 
返回值是成功提取的格式化数据的个数,返回失败为-1
string s1,s2,s3;读到的%s字符串不让用string来承接
也是,char数组字符串的分割有strtok,sscanf
string字符串可以利用algorithm里的函数substr,或者直接构造函数
string s(str,begin,len); s=str.substr(begin,len),
不方便在有时确定不了len,start倒是可以边截取边计数 
#include <iostream>
using namespace std;
int main(){
	int cnt=0;
	char buf1[255], buf2[255], buf3[255],buf4[255]; 
	cnt=sscanf("how are you","%s %s %s",buf1,buf2,buf3);
	cout<<cnt<<" "<<buf1<<"-"<<buf2<<"-"<<buf3<<endl;
//字符串比较特殊了,format里面%s之间没有空格可以以照样取得3个
//下面的int型就不行了,原字符串有啥,format就得照抄格式,否则只能读到第一个 
	
	int y=-1,m=-1,d=-1;
	cnt=sscanf("2022.1.24","%d.%d.%d", &y,&m,&d);
	cout<<cnt<<" "<<y<<"-"<<m<<"-"<<d<<endl;
//拷贝到变量y,注意参数必须使用y的地址,字符串名字就是首地址	
//	截取指定长度字符串
	sscanf("今天是个好日子", "%5s", buf4); //中文字占2字节,今天 
	cout<<buf4<<endl; 
	
//	主要是这个format里面很有文章 可用简单正则表达式去匹配字符串
	sscanf("123456 abcdANFS","%[0-9] %[a-z]%[A-Z]",buf1,buf2,buf3);
	cout<<buf1<<"-"<<buf2<<"-"<<buf3<<endl;	//试试%[1-9a-c]
	 
	 for (int i = 0; i < 10; i++) buf1[i] = '!';
    sscanf("AAAaaaBBB","%[a-z]",buf1);
    cout<<buf1<<endl;
// ---------str的值为 "!!!!!!!!!!"
//做完前面几个实验后,我们都知道sscanf拷贝完成后,
//	还会在str的后面加上一个null字符,但如果没有一个字符满足条件,
//	sscanf不会在str 的后面加null字符,str的值依然是10个惊叹号。
//	这个实验也说明了,如果不使用%*过滤掉前面不需要的字符,
//	你永远别想取得中间的字符。
    

//  %[^a]:表示取到指定字符为止的字符串,为止的字符是不取的	
	 sscanf("12bc34ed$56adf","%[^$]",buf1); 
	 cout<<buf1<<endl;
	 sscanf("123456abcdedfBCDEF","%[^A-Z]", buf1); 
//   printf("%s\n", buf1); 
		cout<<buf1<<endl;

//	 %*[]: *亦可用于格式中, (即 %*d 和 %*s) 加了星号 (*) 表示
//	 跳过此数据不读入. (也就是不把此数据读入参数中)
//给定已知字符串可以想读哪部分读哪部分,这次读这部分下次看那部分
sscanf("abcd1234AC!","%*[a-z]%[^A-Z!]",buf1);
cout<<buf1<<endl;
sscanf("abcd1234AC!","%*[a-d1-9]%[^1-9!]",buf1);
cout<<buf1<<endl;
//^后面可以带多个条件,且这些条件都受^的作用,比如^1-9!表示
//^1-9且^!(既不是数字,也不是感叹号)

	  sscanf("hello, life 123","%*s%s%d",buf1);
	  cout<<buf1<<endl;
//逗号后面无空格buf1取不到 保持上一条 ','无法分隔两个字符串但" "可 
//空格是个天然分隔符,format里面可以不抄空格,日期的例子 
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值