1. 程式人生 > >C語言中printf(),sprintf(),scanf(),sscanf()的用法和區別

C語言中printf(),sprintf(),scanf(),sscanf()的用法和區別

printf

語法: 

  #include <stdio.h>

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

printf()函式根據format(格式)給出的格式列印輸出到STDOUT(標準輸出)和其它引數中。返回值是輸出的字元數量。

sprintf

語法: 

  #include <stdio.h>

  int sprintf( char *buffer, const char *format, ... );

sprintf()函式和printf()類似,格式控制完全一樣,只要是printf使用的格式化字串,在

sprintf都可以使用,只是把輸出傳送到buffer(緩衝區)。返回值是寫入的字元數量。


功能一:格式化數字字串 

sprintf(s, "%-8X", 12345); //s變成:“12345   

大寫的“X”代表,16進位制大寫形式,寬度佔位置-”代表左對齊 。

功能二:控制浮點數列印格式 

浮點數使用格式符%f控制,預設保留小數點後位數字 %m.nf格式,其中表示列印的寬度,表示小數點後的位數 

sprintf(s, "%10.3f", 3.1415626); //s變成:3.142" 

功能三:連線兩個字串 

直接連線:

char dest[256];

char src1[] = {'a','b','c','d','e'};
char src2[] ={'1','2','3','4'};s

printf(dest,"%.5s%.4s",src1,src2); //output:abcde1234

擷取字串的某一些字元進行連線

char dest[256];

char src1[] = {'a','b','c','d','e'};
char src2[] ={'1','2','3','4'};

sprintf(dest,"%.*s%.*s",2,src1,3,src2); //output:ab123

功能四:字元/Ascii 碼對照我們知道,

使用%d或者%x列印一個字元,便能得出它的10 進位制或16 進位制的ASCII 碼;反過來,使用%c列印一個整數,便可以看到它所對應的ASCII 字元。以下程式段把所有可見字元的ASCII 碼對照表列印到螢幕上(這裡採用printf,注意#%X合用時自動為16 進位制數增加0X字首):
for(int i = 32; i < 127; i++) {
    printf("[ %c ]: %3d 0x%#04X\n", i, i, i);
} 

功能五:列印地址資訊 

有時除錯程式時,我們可能想檢視某些變數或者成員的地址,由於地址或者指標也不過是個32 位的數,你完全可以使用列印無符號整數的%u把他們打印出來:
sprintf(s, "%u", &i);
不過通常人們還是喜歡使用16 進位制而不是10 進位制來顯示一個地址:
sprintf(s, "%08X", &i);
然而,這些都是間接的方法,對於地址列印,sprintf 提供了專門的%p
sprintf(s, "%p", &i);
我覺得它實際上就相當於:
sprintf(s, "%0*x", 2 * sizeof(void *), &i); 

功能六:利用返回值

printfsprintf返回值是寫入的字元數量。

也就是說每當一次sprinf 呼叫結束以後,你無須再呼叫一次strlen 便已經知道了結果字串的長度。如:
int len = sprintf(s, "%d", i); 

scanf

語法: 

  #include <stdio.h>

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

scanf()函式根據由format(格式)指定的格式從stdin(標準輸入)讀取,並儲存資料到其它引數.

sscanf

語法: 

  #include <stdio.h>

  int sscanf( const char *buffer, const char *format, ... );

函式sscanf()scanf()類似只是輸入從buffer(緩衝區)中讀取.

sscanfscanf類似,都是用於輸入的,只是後者以螢幕(stdin)為輸入源,前者以固定字串為輸入源

用法:

%[ ]表示要讀入一個字元集合如果後面第一個字元是”^”,則表示反意思。[ ]內的字串可以是1或更多字元組成。空字符集(%[])是違反規定的,可導致不可預知的結果。%[^]也是違反規定的。

%[a-z] 讀取在 a-z 之間的字串,如果不在此之前則停止,如

               char s[]="hello, my friend” ; // 注意: ,逗號在不 a-z之間

               sscanf( s, “%[a-z]”, string ) ; // string=hello


%[^a-z] 讀取不在 a-z 之間的字串,如果碰到a-z之間的字元則停止,如

               char s[]="HELLOkitty” ; // 注意: ,逗號在不 a-z之間

              sscanf( s, “%[^a-z]”, string ) ; // string=HELLO

%*[^=] 前面帶 號表示不儲存變數。跳過符合條件的字串。

              char s[]="notepad=1.0.0.1001" ;

               char szfilename [32] = "" ;

               int i = sscanf( s, "%*[^=]", szfilename ) ;// szfilename=NULL,因為沒儲存

               intj = sscanf( s, "%*[^=]=%s", szfilename ) ;// szfilename=1.0.0.1001

%40c 讀取40個字元

%[^=] 讀取字串直到碰到’=’號,’^’後面可以帶更多字元,如:

              char s[]="notepad=1.0.0.1001" ;

              char szfilename [32] = "" ;

               int i = sscanf( s, "%[^=]", szfilename ) ;           // szfilename=notepad 

               如果引數格式是:%[^=:] ,那麼也可以從 notepad:1.0.0.1001讀取notepad


參考資料:

C++幫助文件