1. 程式人生 > >C語言的標準輸入輸出函式學習總結

C語言的標準輸入輸出函式學習總結

I/O對於程式設計是必不可少的,程式的執行既需要有資料的輸入,也需要有相應結果的輸出,這是程式的基本。

學習C語言首先接觸的兩個I/O函式:printf(char*,...)和scanf(char*,...)

printf 它的返回值為它輸出字元的個數,如printf(“Hello Word!”)的返回值為11

它通過轉換說明符來實現引數的值的輸出 如prinf("%d",i);輸出了整數i的值,%d是轉換說明,引數i應為整數。

%a (%A):浮點數,十六進位制的p-計數法(就是將數化為十六進位制數例如 0xa.1c p10=(10+1*(1/16)+12*(1/256))*(2的10次方)類似於二進位制的e計數(經測試輸出的一定為0x1.xxxxxpy的形式,應該是某種規定類似於規格化數。)

%c :輸出一個字元

%d (%i):輸出一個有符號整型(int)

%e(%E):浮點數,e計數法(小數點之前的一位不小於1(數值零除外))

%f :浮點數,十進位制計數法(不進行小數點的移動,即沒有後面的基數次冪)

%g(%G):根據數值不同自動選擇%f或%e。(%e在指數小於-4時或者大於等於精度時使用,且不顯示後面多餘的0如0.007000為單精度浮點數精度為6-7位,輸出時輸出0.007) 

%u :輸出無符號整型(unsigned int)

%o :輸出無符號八進位制數

%p :指標

%s :字串

%x(%X)使用十六進位制的無符號十六進位制整數

%% :列印一個%

對轉於換說明符,還有相應的修飾符

-    :表示左對齊(預設為右對齊),比如對於 int i=-1   printf(“%5d",i);意思是最短長度應為5個字元,否則在其左側新增空格以補足,輸出為   -1;距離左邊界有5個字元。而%-5d則是輸出為-1,進行左對齊;

+   :表示顯示數的符號,正數新增+,負數新增-

(空格):表示正數帶前導空格,但是不顯示符號,負數用-號覆蓋空格

#     : 若轉換說明符為%o則加上前導0,若為%x(%X)則加上前導0x,若為浮點數它保證即使沒有數字也會列印一個小數點,若轉換說明符為%g(%G)則保證尾隨零不會被刪去.例如上例中 0.007000 在 %g 說明符下輸出 0.007 而在 %#g 說明符下輸出0.007000

0     :用前導0而不是空格去填充字元寬度

digit(說明符前加上數字) :指定整個欄位的最小寬度,不足則以空格填充

.digit(說明符前加上.數字):對於%e,%f是要列印的小數點右邊的位數。對於%g是有效數字的最大位數。對於%s,是列印字元的最大位數。對於整數,是列印數字的最小位數。不足則以前導0來填充.例如 float l=1.1111,m=1.1111;printf("%.5f,%.5g",l,m);輸出結果為 1.11110 ,1.1111;前者小數點後面位數要為5位不足以0填充,後者最大有效位數要為5位,不足則正常輸出,超出則從尾端開始截斷,對於%.(n)g和%.(n)s作用是一樣的。對於%.(n)d則是整數的最小有效位數不足以0填充。如

int i=111;printf("%.4d",i);輸出結果為0111;

h  :和整數說明符使用,轉換為短整型輸出

hh:和整數說明符使用,轉換為char型輸出;事實上是隻輸出最後一個位元組的值。

l    :和整數說明符使用,轉換為長整型輸出;

ll    :和整數說明符使用,轉換為long long int 輸出;(這裡使用的應該是符號擴充套件!)

還有(t :表示兩個指標之差型別 ptrdiff_t ;z:表示sizeof的返回值size_t型別  均為C99的新增部分,(只是照書上的寫下來對此也不是很瞭解!O__O "…))

還有一個特殊的修飾符* 

它的用法如下: printf("%*.*f",width,n,digit);

width和digit均為整型變數,n為float型別,若width==5,digit=2,則上述輸出結果等價為printf("%5.2f",n);

也就是說欄位寬度可以由程式來指定而不用事先指定好。

scanf(char*,...)是一個和printf(char*,...)相配對的函式,不是說使用scanf就必須使用printf,而是兩者在使用方法上是極為類似的;均是通過轉換說明符來解釋輸入和輸出。因此兩者具有相同的轉換說明符。不過修飾符的用法,會有所差異,因為一個是輸入函式,一個是輸出函式。

scanf的工作原理實際上是通過逐個讀取字元,然後再通過轉換說明符,計算值並賦予變數。

例如:int i;scanf(“%3d”,&i(需要提供地址才能修改變數的值,&為地址運算子));若你在鍵盤鍵入12345,則讀入的字元只有'1' '2' '3',經過計算之後將值123賦給變數i;讀取方式為從第一個非空字元讀入,若讀取的第一個為+,-或數字則繼續讀取下一個字元,在遇到換行或空格時、達到所指定的最大位數、字元不為數字這三個條件任一一個發生時都會停止讀取(即完成一次讀取);若首個遇到的字元不為上述所列出的字元,則輸入停止,並不賦給變數任何值。下次讀取仍從上次停止的地方讀入,而不會跳過。

float f; scanf("%e",&f);表明輸入可以識別e表示法,同理scanf("%f",&f); scanf("%a",&f); scanf("%o",&f); scanf("%x",&f);分別表示可以識別十進位制表示法,p進製表示法,八進位制表示法,十六進位制表示法。

char* l; scanf("%(n)s",l);表示讀入一串長度為n的字串,從第一個非空字元讀入,到第n個字元或是遇到空格和換行時停止輸入,並會在字串後新增'\0'(c字串結尾標誌)

.char c; scanf("%c",&c);讀入一個字元,因此不會跳過空格。

scanf的返回值為它所成功讀入的次數(讀入表示一次完整讀入)當發生讀入錯誤時,若有多個轉換說明符,會在第一個出錯的地方停止讀入並結束。

*對於scanf中的轉換說明符是一個非常有用的修飾符。

例如可以通過如下語句來防止scanf函式的讀入提留在一個地方不動。

假設我們要連續讀入多個整數。但是若鍵入了字母字元則會使得scanf函式一直停留在首次碰到的字母的位置。但是通過以下語句

while(i>0)//以i<=0做為跳出條件

{   

if(!scanf("%d",&i))  scanf("%*s");

fp(fp,"% d",i);

}

scanf("%*s");的作用就是跳過一個字串,它在讀入階段和讀入一個字串的工作相同,但是並不將其賦予任何變數而是將其丟棄。

因為printf和scanf的功能很多,所以相比較下面學的輸入輸出函式要來的複雜些。

字元輸入輸出函式

1、char getchar(void) 從標準輸入中(stdin(一般c程式會自動開啟鍵盤檔案,將其視作為標準輸入))讀入一個字元並將其返回; int putchar(char) 向標準輸出中(stdout(一般c程式會自動開啟顯示器檔案,將其視作標準輸出))輸出一個字元並返回其值(int 型別);一個例項:

#include<stdio.h>

void main()

{

char ch;

while((ch=getchar())!='\n')    printf(",%d",putchar(ch));//結果輸出字元的ASCLL和字元

}

2,char getc(FILE*fp)是從檔案指標所指檔案處獲取字元ch=getc(stdin);和ch=getchar();是等價的;

     int putc(char ch,FILE*fp)是向檔案指標所指檔案輸出字元 putc(ch,stdout)和putchar(ch);是等價的;

行輸入輸出函式

1,int puts(char*);向標準輸出輸出字串,若成功則返回0.若輸出檔案結尾或出錯則返回其他值;puts除了輸出char*所指的字串外還會額外的輸出一個換行符。即在字串結尾後會換行。

    char* gets(char*):從標準輸入中獲取字串,並返回儲存的位置,當其遇到檔案末尾或出錯時返回空指標NULL。gets從第一個非空字元讀入直到遇到換行符結束讀入,但是並不讀入換行符。即gets讀取一行字元,並在其末尾新增‘\0';

2,int fputs(char* ch,FILE* fp):將字串輸出到檔案指標fp所指檔案的位置指標所指的位置處。成功則返回0,遇到檔案結尾則返回EOF(-1);不會新增換行輸出;

     char* fgets(char*ch,int n,FILE*fp);n為所能讀取的最大長度(包括'\0'),從檔案位置指標開始讀入,直到遇見換行或者達到最大長度-1,停止讀入,並在字串結尾新增'\0';不像gets函式,fgets會讀取所遇到的'\n'並存入,而不是像gets那樣丟棄。

3、int fprintf(FILE*fp,char*,...)用法和printf是一樣的,只是多了一個引數FILE*用於進行輸出重定向。

     int fscanf(FILE*fp,char*,...)用法和scanf是一樣的,只是多了一個引數FILE*用於進行輸入重定向。

     int sprintf(char*,char*,...)用法和printf是一樣的,只是輸出到字元指標所指的位置。

塊輸入輸出函式

size_t fwrite(const void*,size_t,int,FILE*)   第一個引數為泛型指標,亦即它接受任何指標型別的實參。為什麼要用泛型指標,因為我們並不能確定寫入檔案的資料型別,有可能是一個整型、也可能是一個結構。第二個引數為所寫入資料型別的大小(以位元組為單位)。第三個引數為所寫入資料的個數。第四個引數為所要寫入的檔案的指標。最終返回寫入資料的個數,當寫入過程出錯或者遇到檔案結尾,返回的值可能會小於第三個引數的值。

size-t fread(void*,size_t,int,FILE*)     第一個為地址要讀入資料的地址,第二個引數為資料型別的大小,第三個引數為要寫入的資料個數,第四個引數為輸入的檔案的指標。

這倆個函式特別適用於以二進位制模式開啟的檔案的讀寫操作,因為原有資料所佔的大小,在輸入輸出前後是不變的。

基本上就是這些主要的輸入輸出函式。雖說是學習總結但是寫的過程中還是發現有很多東西沒有記住(記性就是這麼×),有寫的錯誤的地方,懇請各位大神相告。

-------------------------------------------------------我是分割線----------------------------------------------------------------

另外有沒自學c語言最後走上職場的前輩,你們是怎麼看待c的呢(發展趨勢和程式設計領域的地位),在學習完語法,規則,通用的庫,之後又是怎樣繼續提高自己對c的認識。