C語言 輸出

2018-09-29 18:40 更新

輸出

fputs

用fputs()把一個字符串寫入到文件中
int fputs (char string, FILE fp) ;
功能:把字符串string寫入到文件fp中
若fp為stdout,則為向屏幕輸出。

printf

int printf ( char const format, …… ) ;
int fprintf ( FILE fp, char const format, …… ) ;
int sprintf ( char const string, char const *format, ……) ;
//以上函數(shù)的輸出字符規(guī)則都相同,不同的是它們寫入的流不同,一個是向屏幕寫入、一個向文件流寫入、一個向字符串寫入。

帶域?qū)捄途鹊拇蛴?/h3>

printf函數(shù)允許你為欲打印的數(shù)據(jù)指定精度。對于不同類型的數(shù)據(jù)而言,精度的含義是不一樣的。

精度與整型轉(zhuǎn)換說明符%d一起使用時,表示要打印的數(shù)據(jù)的最少數(shù)字位數(shù)。如果將要打印的數(shù)據(jù)所包含的數(shù)字的位數(shù)小于指定的精度,同時精度值前面帶有一個0或者一個小數(shù)點,則加填充0。

精度與浮點型轉(zhuǎn)換說明符%f一起使用時,表示將要打印的最大有效數(shù)字位數(shù)。

精度與字符串轉(zhuǎn)換說明符%s一起使用時,表示將要從一個字符串中打印出來的最大字符個數(shù)。(可用于控制打出的字符的個數(shù))表示精度的方法是:在百分號和轉(zhuǎn)換說明符之間,插入一個表示精度的整數(shù),并在整數(shù)的前面加上一個小數(shù)點。

域?qū)捄途?/strong>可以放在一起使用,方法是:在百分號和轉(zhuǎn)換說明符之間,先寫上域?qū)?,然后加上一個小數(shù)點,后面再寫上精度。

例:
printf(“%9.3f”, 123.456789) ;
的輸出結(jié)果是123.456

還可以用變量來控制域?qū)捄途?/strong>(可用于關(guān)于精度的舍入)
在格式控制字符串中表示域?qū)捇蚓鹊奈恢蒙蠈懮弦粋€星號 * ,然后程序?qū)嬎銓崊⒘斜碇邢鄬?yīng)的整型實參值,并用其替換星號。

例:
printf(“% . f”, 7, 2, 98.736) ; 將以7為域?qū)挘?為精度,輸出右對齊的98.74
表示域?qū)挼闹悼梢允钦龜?shù),也可以是負(fù)數(shù)(將導(dǎo)致輸出結(jié)果在域?qū)拑?nèi)左對齊)

使用標(biāo)記

printf函數(shù)還提供了一些標(biāo)記來增加它的輸出格式控制功能,在格式控制字符串中可以使用的標(biāo)記有:

  • -(減號) 在域?qū)拑?nèi)左對齊顯示輸出結(jié)果
  • +(加號) 在正數(shù)前面顯示一個加號,在負(fù)數(shù)前面顯示一個減號
  • 空格 在不帶加號標(biāo)記的正數(shù)前面打印一個空格
  • #(井號) 當(dāng)使用的是八進制轉(zhuǎn)換說明符o時,在輸出數(shù)據(jù)前面加上前綴0 ; 當(dāng)使用的是十六進制轉(zhuǎn)換說明符x或X時,在輸出數(shù)據(jù)前面加上前綴0x或0X
  • 0(零) 在打印的數(shù)據(jù)前面加上前導(dǎo)0

逆向打印參數(shù)(POSIX擴展語法)

printf("%4$d %3$d %2$d %1$d", 1, 2, 3, 9); //將會打印9 3 2 1

返回值

printf 返回值是輸出的字符個數(shù)。

#include <stdio.h>
int main()
{
    int i=43;
    printf("%d\n",printf("%d",printf("%d",i)));
    return 0;
}//程序會輸出4321

IO緩沖問題

在進行輸入/輸出時,程序并不是馬上從輸入/輸出設(shè)備處理數(shù)據(jù),而是先把數(shù)據(jù)放到緩存中,當(dāng)緩存滿時才進行輸入/輸出操作(或是遇到刷新操作,比如遇到換行或 fflush )。

C 實現(xiàn)通常允許程序員設(shè)置流的緩存大小。

void setbuf (FILE steam, char buf) ;
參數(shù) buf 必須指向一個長度為 BUFSIZ (定義在 stdio.h 頭文件中)的緩沖區(qū)。

例:
setbuf (stdout, buf) ;
將告訴 I/O 庫寫入到 stdout 中的輸出要以 buf 作為一個輸出緩沖,并且等到 buf 滿了或程序員直接調(diào)用 fflush() 再實際寫出。

將buf參數(shù)設(shè)置為NULL,可關(guān)閉緩沖。

注意緩存的生命期問題

例:
下面的程序解釋了通過使用 setbuf() 來把標(biāo)準(zhǔn)輸入復(fù)制到標(biāo)準(zhǔn)輸出:

#include <stdio.h>  
int  main()  
{      
    int c;    
    char buf[BUFSIZ];       
    setbuf(stdout, buf);    
    while((c = getchar()) != EOF)          
         putchar(c);   
    return 0 ;  
}    

這段程序隱藏著一個細(xì)微的Bug:
緩沖區(qū)最后一次刷新是在主程序完成之后,庫將控制交回到操作系統(tǒng)之前所執(zhí)行的清理的一部分。在這一時刻,緩沖區(qū)已經(jīng)被釋放了?。磎ain函數(shù)棧清空之后)

有兩種方法可以避免這一問題:

  1. 使用靜態(tài)緩沖區(qū),或者將其顯式地聲明為靜態(tài)
    static char buf[BUFSIZ];
    或者將整個聲明移到主函數(shù)之外。

  2. 動態(tài)地分配緩沖區(qū)并且從不釋放它
    setbuf (stdout, malloc(BUFSIZ));
    注意在后一種情況中,不必檢查malloc()的返回值,因為如果它失敗了,會返回一個空指針。而setbuf()可以接受一個空指針作為其第二個參數(shù),這將使得stdout變成非緩沖的。這會運行得很慢,但它是可以運行的。
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號