sscanf和sprintf詳解

前言

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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章