sscanf的使用

來源:互聯網
上載者:User
 

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;

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.