sscanf和sprintf是scanf和printf家族的一對成員,用於處理和分析字串非常強大得兩個函數
標頭檔 stdio.h
原型
int sscanf(
const char *buffer,
const char *format,
...
);
int sprintf(
char *buffer,
const char *format,
...
);
功能:類似於scanf和printf 但從字串*buffer用於輸入輸出
1.sprintf用于格式化字串
把變數列印到字串中,從而獲得數位字元形式,這樣不需要手工轉換。
例如
char c[100];
int k=255;
sprintf(c,"%d",k);
//c包含"255"
2.sprintf用於進位轉換
可以方便地得到變數的十六進位和八進位字元序列,再稍加處理即可得到每一位的值。
char c[100];
int k=255;
sprintf(c,"%x",k);
//c包含"ff" c[0]='f' c[1]='f'
3.sprintf用於連接字串
方便地串連兩個或者多個字串
char buf[1024];
char a[100]="I ";
char b[100]="love ";
char c[100]="ACM."
sprintf(buf,"%s%s%s",a,b,c);
//buf 包含"I love ACM."
4.sscanf用於處理輸入
有些比較麻煩的輸入輸出用sscanf處理將會非常方便
如hrbeu1002 (這裡給出的不是完整代碼,其中輸出部分只是簡單地原樣列印出來。)
因為scanf在使用除了%c以外的格式時都忽略分行符號'/n',題中用空行來區分不同case的要求
顯得難以處理,如果使用sscanf的話,可以先把輸入用scanf存入一塊緩衝區當中,再用sscanf讀取
這樣大大減少了工作量。
#include <stdio.h>
int T[100];
int P[100];
int i;
bool Input()
{
int p=0;
char buf[1024];
i=0;
while(scanf("%c",&buf[p])!=EOF)
{
if(buf[p]==10)
{
if(p==0)return 1;
sscanf(buf,"%d %d",&T[i],&P[i]);
i++;
p=-1;
}
p++;
}
return 0;
}
void output()
{
int j;
for(j=0;j<i;j++)
{
printf("%d %d/n",T[j],P[j]);
}
printf("/n");
}
int main()
{
while(Input())output();
return 0;
}
5.sscanf用於分析字串
sscanf可以支援格式字元%[] 這為分析字串提供了很大方便(其實scanf也支援%[])
先看一下%[] 格式:
(1)-: 表示範圍,如:%[1-9]表示唯讀取1-9這幾個數字 %[a-z]表示唯讀取a-z小寫字母,類似地 %[A-Z]唯讀取大寫字母
(2)^: 表示不取,如:%[^1]表示讀取除'1'以外的所有字元 %[^/]表示除/以外的所有字元
(3),: 範圍可以用","相串連 如%[1-9,a-z]表示同時取1-9數字和a-z小寫字母
(4)原則:從第一個在指定範圍內的數字開始讀取,到第一個不在範圍內的數字結束%s 可以看成%[] 的一個特例 %[^ ](注意^後面有一個空格!)
這樣使用sscanf+%[]可以輕鬆的分析字串,很多字串問題便迎刃而解了。
以hrbeu3001為例(不是完整代碼,沒有要求的格式)
只需2個sscanf函數,就能完成題目的要求,代碼非常簡潔。
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
char buf[1024],str1[100],str2[100],str3[100],str4[100],temp[100]="<default>";
int count;
scanf("%d",&count);
while(count--)
{
str1[0]='/0';
str2[0]='/0';
str3[0]='/0';
str4[0]='/0';
scanf("%s",buf);
sscanf(buf,"%[^:]://%[^:,/]:%[,1-9]",str1,str2,str3,str4);
sscanf(buf,"%[^:]://%[^:,/]/%[a-z,A-Z,/,~]",str1,str2,str4);
if(str3[0]=='/0')strcpy(str3,temp);
if(str4[0]=='/0')strcpy(str4,temp);
printf("%s/n%s/n%s/n%s/n",str1,str2,str3,str4);
}
return 0;
}