前言

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;
}