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的認識。