文章目錄
- 前言
- scanf和printf函式
- fscanf和fprintf函式
- sscanf和sprintf函式
- 總結
前言
C語言中,許多函式的函式名過于相似,使用者要是不能很好地區分這些函式,就會造成誤用,最終導致代碼的結果大相徑庭,對于scanf和printf函式、fscanf和fprintf函式、sscanf和sprintf函式這三對函式,它們的函式名都只是各自相差一個字母而已,但其功能及其用法卻并不相同,有多少人能夠真正分清楚它們各自的功能與使用方法呢?
其中,知道printf和scanf函式的人最多,其次是fprint和fscanf函式,知道sprintf和sscanf函式的人最少,本篇博文,就帶大家一同認識認識這三對函式,區分它們各自的功能與使用方法,
scanf和printf函式
scanf函式和printf函式是應用于標準輸入流和標準輸出流的格式化輸入輸出陳述句,
一、scanf函式
scanf函式的功能是從標準輸入流讀入格式化的資料,
int scanf ( const char * format, ... );
從標準輸入流(stdin)讀取資料,并根據引數格式將它們存盤到附加引數所指向的位置,附加引數應指向已分配的物件(即附加引數應是一個地址,或者說指標),這些物件的型別由格式字串中相應的格式說明符指定,
例如,以下代碼:
scanf("%d", &input);
//scanf("%d", input);//error
scanf函式以%d(整型)的格式從標準輸入流讀入的資料存盤到&input所指向的記憶體空間,所以說,我們之后若是列印變數input,就會列印出已讀取的這個值,
二、printf函式
printf函式的功能是將格式化的資料列印到標準輸出流上去,
int printf ( const char * format, ... );
printf函式將format指向的C字串寫入標準輸出流(stdout),如果format字串中包含格式說明符(以%開頭的子序列),則format后面的附加引數將被格式化并插入結果字串中,以替換它們各自的說明符,
我們平時已經習慣了這樣使用printf函式:
printf("hello world!\n");//第一種寫法
其實傳入printf函式的引數本質上是一個指向字串的指標,于是我們這樣寫也是沒問題的:
char arr[] = "hello world!\n";
printf(arr);//第二種寫法
第一種寫法中,直接將一個字串傳入printf函式,實際上也是將該字串的首地址傳入了函式,本質上與第二種寫法相同,所以那樣寫也是沒有問題的,
fscanf和fprintf函式
fscanf函式和fprintf函式是應用于所有輸入流和所有輸出流的格式化輸入輸出陳述句,
fscanf函式和fprintf函式是一對檔案操作函式,在博主的檔案操作函式(二)中有詳細介紹,這里就不再詳細介紹,
既然說fscanf函式和fprintf函式是應用于所有的標準輸出流和標準輸入流的函式,那么這對函式的功能也就包含了printf函式和scanf函式的功能,我們完全可以用fscanf函式和fprintf函式來做scanf函式和printf函式做的事,
一、fscanf函式實作scanf函式的功能
int fscanf( FILE *stream, const char *format [, argument ]... );
因為fscanf函式的功能是,從stream中讀取資料,并根據引數格式將其存盤到附加引數所指向的位置,所以我們只需將引數stream的位置傳入stdin,使其在標準輸入流中讀取資料即可,
所以,下面兩句代碼的作用是等效的:
scanf("%d", &input);
fscanf(stdin, "%d", &input);
二、fprintf函式實作printf函式的功能
int fprintf( FILE *stream, const char *format [, argument ]...);
因為fprintf函式的功能是,將格式化資料寫入stream中,所以我們只需將引數stream的位置傳入stdout,使其將資料寫入標準輸出流即可,
所以,下面兩句代碼的作用是等效的:
printf("%d\n", input);
fprintf(stdout, "%d\n", input);
三、拓展
我們之前在介紹檔案操作函式的時候就說過,當你要對某一個流進行輸入或是輸出操作的時候,首先要打開該流,當輸入輸出操作結束后要及時關閉該流,
既然printf函式和scanf函式也要對標準輸入流和標準輸出流進行操作,那么為什么在使用printf函式和scanf函式之前,并沒有類似于打開檔案流的fopen函式的使用,在使用完printf函式和scanf函式后又沒有類似于關閉檔案流的fclose函式的使用呢?
其實,當C程式運行起來的時候,會自動打開下面這三個流:
| 符號 | 名稱 | 對應操作(顯示)位置 |
|---|---|---|
| stdin | 標準輸入流 | 鍵盤 |
| stdout | 標準輸出流 | 螢屏 |
| stderr | 標準錯誤流 | 螢屏 |
而當程式運行結束后,這三個流又會自動關閉,所以,當我們需要對標準輸入流或是標準輸出流進行輸入輸出操作的時候,并不需要通過某些操作來打開這兩個流,也不需要我們來關閉這兩個流,
sscanf和sprintf函式
sscanf函式可以從字串中讀取格式化資料,sprintf函式可以將格式化資料寫入字串,
一、sscanf函式
int sscanf ( const char * s, const char * format, ...);
sscanf函式從s讀取資料并根據引數格式將其存盤到附加引數給定的位置,就像使用scanf一樣,但sscanf函式是從s讀取資料而不是標準輸入(stdin),
例如,我們要將字串arr里面的內容按照不同的格式讀取出來,
#include <stdio.h>
int main()
{
char arr[] = "2021 dragon";
int year = 0;
char s[10] = { 0 };
sscanf(arr, "%d %s", &year, s);
printf("%d\n", year);//2021
printf("%s\n", s);//dragon
return 0;
}
也就是將從區域一中,以區域二的格式讀取的資料,存盤到區域三指向的空間,

二、sprintf函式
int sprintf ( char * str, const char * format, ... );
sprintf函式與printf函式功能相似,區別在于:printf函式是將資料格式化后直接列印在螢屏上,而sprintf函式是將資料格式化后存盤在str所指向的字串中,
例如,將資料按照不同的格式寫入字串arr中,
#include <stdio.h>
int main()
{
char arr[20] = { 0 };
int year = 2021;
char s[] = "dragon";
sprintf(arr, "%d %s", year, s);
printf("%s\n", arr);//2021 dragon
return 0;
}
也就是將從區域三中,以區域二的格式讀取的資料,存盤到區域一指向的位置,

總結
| 函式 | 功能 |
|---|---|
| scanf,printf | 應用于標準輸入流和標準輸出流的格式化輸入輸出陳述句, |
| fscanf,fprintf | 應用于所有輸入流和所有輸出流的格式化輸入輸出陳述句, |
| sscanf,sprintf | 應用于字串和格式化資料之間的相互轉換 |
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/272537.html
標籤:其他
上一篇:用OSPF進行vlan劃分
