前言
sscanf和sprintf在处理字符串问题上很有用!(sscanf和sprintf可以从字面意思上分别理解为string+scanf和string+printf,均在头文件stdio.h下)。
正文
简单举例
/*
sscanf与sprintf
sscanf(str,"%d",&n) 其实就是把str的内容以"%d"的格式写入到n中(从左到右)
同理 sprintf(str,"%d",n)就是把n以"%d"的格式写入到str (从右到左)
*/
#include<cstdio>
#include<iostream>
using namespace std;
int main(){
int n;
char str[10]="666";
char str1[10];
sscanf(str,"%d",&n);
printf("%d\n",n);
sprintf(str1,"%d",n);
printf("%s\n",str1);
return 0;
}
上述输出结果为
666
666
处理上述例子,还可以使用较为复杂的格式,如下
#include<cstdio>
#include<iostream>
using namespace std;
int main(){
int year;
double date;
char str1[100],str2[100]="2020:7.2:go!",str3[100]="woo~";
sscanf(str2,"%d:%lf:%s",&year,&date,str1);
printf("========sscanf========\n");
printf("year=%d,date=%.1f,str1=%s\n",year,date,str1);
printf("========sprintf========\n");
sprintf(str1,"%d:%.1f:%s",year,date,str3);
printf("%s",str1);
return 0;
}
结果如下图所示:
sscanf和sprintf应用如下:(以下例题为蓝桥杯模拟题)
一般都是使用sprinf将整型数据写入到字符串数组,再
将字符串数组转为string,从而使用string的方法函数
例一:
/*
在1至2019中,有多少个数的数位中包含数字9?
注意,有的数中的数位中包含多个9,这个数只算一次。例如,1999这个数包含数字9,在计算时只是算一个数。
*/
#include <iostream>
#include<cstdio>
using namespace std;
const int N = 2019;
bool check(int i) {
char s[5];
sprintf(s, "%d", i);
string str(s);//char数组转string
return str.find('9') != string::npos;
}
int main() {
int ans = 0;
for (int i = 9; i <= N; ++i) {
if (check(i)){
ans++;
cout<<ans<<":"<<i<<endl;
}
}
cout << ans << endl;
return 0;
}
例二:
#include<iostream>
#include<string>
#include<cstdio>
using namespace std;
/*
一个正整数如果任何一个数位不大于右边相邻的数位,则称为一个数位递增的数,例如1135是一个数位递增的数,而1024不是一个数位递增的数。
给定正整数 n,请问在整数 1 至 n 中有多少个数位递增的数?
*/
char str[1000001];
bool check(string num){
int len=num.size();
for(int i=0;i<len-1;i++){
if(num[i]>num[i+1])return false;
}
return true;
}
//整型数转字符串
string toStr(int i){
sprintf(str,"%d",i);
string num(str);
return num;
}
int main(){
int n,count=0;
string num;
cin>>n;
for(int i=1;i<=n;i++){
num=toStr(i);
if(check(num))count++;
}
cout<<count<<endl;
return 0;
}