C語(yǔ)言 輸出

2018-09-29 18:40 更新

輸出

fputs

用fputs()把一個(gè)字符串寫(xiě)入到文件中
int fputs (char string, FILE fp) ;
功能:把字符串string寫(xiě)入到文件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ī)則都相同,不同的是它們寫(xiě)入的流不同,一個(gè)是向屏幕寫(xiě)入、一個(gè)向文件流寫(xiě)入、一個(gè)向字符串寫(xiě)入。

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

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

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

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

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

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

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

還可以用變量來(lái)控制域?qū)捄途?/strong>(可用于關(guān)于精度的舍入)
在格式控制字符串中表示域?qū)捇蚓鹊奈恢蒙蠈?xiě)上一個(gè)星號(hào) * ,然后程序?qū)?huì)計(jì)算實(shí)參列表中相對(duì)應(yīng)的整型實(shí)參值,并用其替換星號(hào)。

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

使用標(biāo)記

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

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

逆向打印參數(shù)(POSIX擴(kuò)展語(yǔ)法)

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

返回值

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

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

IO緩沖問(wèn)題

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

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

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

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

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

注意緩存的生命期問(wèn)題

例:
下面的程序解釋了通過(guò)使用 setbuf() 來(lái)把標(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 ;  
}    

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

有兩種方法可以避免這一問(wèn)題:

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

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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)