分类
Level4

sscanf与sprintf

头文件 #include<cstdio> 或 #include<stdio.h>

处理字符串问题的利器,学会它们可能事半功倍。sscanf可以理解为string+scanf,sprintf可以理解为string+printf。

  • scanf(“%d”, &n); 可以理解为 scanf(screen, “%d”, &n );
  • printf(“%d”, n); 可以理解为 printf(screen, “%d”, n );

也就是说,scanf相当于把screen(屏幕)的内容以“%d”的格式传输到变量n中, printf相当于把n以“%d”的格式传到到 screen(屏幕) 上。

sscanf和sprintf与上面的格式是相同的,只不过把screen (屏幕) 换成了字符数组:

sscanf是从一个字符串中读进与指定格式相符的数据。而sprintf是格式化的数据写入某个字符串中。

#include<cstdio>
using namespace std;
int main(){
    int n;
    char str1[100]="123",str2[100];
    sscanf(str1, "%d", &n);  //n=123
    sprintf(str2, "%d", n);  //str2="123"
    printf("%s\n",str2); //输出123 
    return 0;
}
char nzBuf[10];
sscanf("123456", "%4s", buf);  //取最大长度为4字节的字符串
printf("%s\n", buf);          //结果:1234
char nzBuf[10];
int i=2,j=3;
sprintf(nzBuf,"%d+%d=5",i,j);  
printf("%s\n",nzBuf);         //结果:2+3=5

练习:把一串ip和端口数据(如 “192.168.1.0:8080” )中的5个数字从字符串中取到整数数组中。

#include<cstdio>
using namespace std;
int main(){
    int n,b[5];
    char str1[100]="192.168.1.0:8080",str2[100];
    int x=sscanf(str1, "%d.%d.%d.%d:%d", &b[0],&b[1],&b[2],&b[3],&b[4]);  
    printf("%d\n",x);  //输出5 
    sprintf(str2, "%d %d %d %d %d", b[0],b[1],b[2],b[3],b[4]); 
    printf("%s\n",str2); //输出192 168 1 0 8080
	
    char str3[100]="192.168.1.0.0:8080"; //假设输入格式与下面不匹配 
    int y=sscanf(str3, "%d.%d.%d.%d:%d", &b[0],&b[1],&b[2],&b[3],&b[4]);  //只有部分变量取值正确
    printf("%d\n",y);  //输出4,能正确取值的个数 
    return 0;
}