sscanf和sprintf详解

    技术2022-07-21  92

    前言

    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; }
    Processed: 0.009, SQL: 9