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