scanf 使用總結

來源:互聯網
上載者:User
c標準庫提供的格式化輸出函數:

int scanf(const char *format, ...);

其它family 函數:
int fscanf(FILE *stream, const char *format, ...);
int sscanf(const char *str, const char *format, ...);

scanf最令人興奮的地方就在於 format。這裡使用實際代碼總結下比較少用的2個格式化功能:   %[ ]  和 %n

1.從標準輸入中讀取帶有空格的字串

       當然 我們可以使用char *fgets(char *s, int size, FILE *stream);

       但是scanf同樣可以完成,我們知道scanf的預設以空白符(空格、定位字元、斷行符號)分割字元,所以當你輸入"hello world"之類的字串時,得到的只是 hello而已。

       你可以使用 %[ ] 來完成,    %[ ]可以讓我們自訂一個搜尋字元集,^ 表示取反的意思     %[^\n]表示不是'\n'都讀入,遇到'\n'就停止,也可以在%之後加入數字表示最多讀入多少個字元,這樣可以控制數組溢出。

      

#include <stdio.h>#define MAX_SIZE 128intmain(void){     char buf[MAX_SIZE+1];     scanf("%MAX_SIZE[^\n]",buf);     printf("%s\n",buf);     return 0;}

2.使用自訂的字元分割

        scanf的預設以空白符(空格、定位字元、斷行符號)分割字元,那麼可不可以自己定義分割的字元呢?   可以,同樣使用%[ ]

        比如,這樣一個字串"email:christian_chen@126.com" ,我要從這個字串中提取出user:christian_chen 出來

       一起來看代碼       

#include <stdio.h>#define MAX_SIZE 128intmain(void){    char email_addr[] = "email:christian_chen@126.com";    char user[MAX_SIZE];    sscanf(email_addr,"%*[^:]:%[^@]",user);    printf("%s\n",user);}

%*[^:]表示讀取不是':'的字元,*表示唯讀取不儲存,也就是忽略了字串‘:’之前的內容,:%[^@]匹配了一個':'忽略 ,然後讀取了不是'@'的字元,也就讀取了我們需要的christian_chen

其實stdin.h 提供的scanf非常實用,這裡總結一些小技巧

   之後總結.....

   

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.