C語言的格式化輸入輸出靠的是printf和scanf函數,在stdio.h頭檔案。
格式化輸出:
Printf具有傳回值,值為本次調用字元的個數,包括回車等控制符。
看一種使用方式:int i =5; Printf("%d",i);就是将整型變量i替換到字元串中,輸出的結果也就是5。理所當然地,還可以Printf("%d,%d,%d,%d",i1,i2,i3,i4);前面的%d稱為占位符,就是這個位置是為後面的i留着的,前面占了多少個位置,後面就必須有多少個變量,一個蘿蔔一個坑。
%d - 0 m.n |或者h 格式字元
//%轉換說明的開始(占位符)
//-表示左對齊,預設是右對齊。
//0表示空位填0,省略則空位不填。
//m.n : m是域寬,指對應的輸出項在輸出裝置占用多少個字元的寬度。n是精度,輸出浮點數的時候,小數點後面的位數,預設是6。
//l或者h :l整數,long;浮點數,double。h将整數的格式修整為short。
常用例子:
Printf("%d\n",7);
Printf("%4d\n",7);//數字占四個位置
Printf("%-4d\n",7);//-表示數字左對齊
Printf("%04d\n",7);//沒有占滿的位置用0
Printf("%d,%c\n",'a','a');//字元類型資料%c,字元用ASCLL碼表存儲,%c的時候編譯器會去查表。%d則直接輸出數字。
Printf("%f\n",1.5f);//浮點類型資料用%f
Printf("%5.2\n",1.5f);//一共占五個位置,小數點占後兩位
Printf("%lf\n",1.5);//雙精度浮點數用%lf表示
printf("整型:%i\n浮點型:%f\n符号:%c\n",123,45.6,'$');
printf("十六進制%x, 八進制%o\n", 763, 763);
printf("float/double去掉了尾随的0:%g\n",45.6);
格式字元:
%c和%hhd: char
%c和%hhu: unsigned char
%c對應字元身份,%hhd和%hhu對應數字身份
%hd short
%hu unsigned short
%hx: 以16進制的 輸出short類型的整數
%i/%d: int
%u: unsigned int
%ld long
%lu unsigned long
%x/%o: 十六進制/八進制
%#x/%#o: 顯示各進制數字首
%f/%lf: float/double
%g/%lg: float/double去掉了尾随的0
%s: "string"
%p: address
%e: 指數形式,科學計數法
%nd也可以作為占位符列印整數數字,n是一個整數。列印結果一定占n個位置,空位置補充空格字元
%-nd列印結果也占n個位置,空位置出現在右邊
%0nd列印結果也占n個位置,空位置用字元‘0’填充
%n.mf可以用來列印浮點數,列印結果中整個數字占n個位置,小數點後面占m個位置
标準輸出寬度占13位,小數點前一位(非零),小數點占一位,6位小數,e占一位,指數符号占一位,指數占三位。
分隔符:空格,Tab, 回車。
格式化輸入scanf:
scanf函數可以從鍵盤上讀取使用者輸入的内容并把它記錄到變量中。它需要變量的位址作為參數。忘記&操作符即發生段錯誤(程式段、資料段、bss段、堆棧、通路非法位址)。
如果用scanf讀取字元串到字元數組中,則不加&
Scanf("%d",&i);//後面跟位址,不能用變量名。如果輸入字母,則不知道怎麼辦,就不讀了。而且一次輸入錯了如果不處理則後面的輸入都無效。
‘’ : 輸入抑制字元,表示該格式說明要求輸入資料,但不指派,即在位址清單中沒有相應的位址項
Scanf(“%3d%5d%f”,&a,&x);
輸入2001200 4.1
則200賦給a,4.1賦給x,1200被跳過不賦給任何變量
scanf尋找資料的起始位址時,會跳過空白符(空格,回車,制表符等)。
scanf不會讀取最後的換行符,解決辦法:scanf("%*c");//可以将回車從緩沖區讀取出來。
Width:寬度訓示符,表示該輸入資料所占列數,系統将自動按它截取所需資料。如遇空格或不可轉換的字元,讀入的字元将減少
有分隔符時,輸入時需要輸入對應的符号。
int age;
float assets;
char pet[30];
printf("Enter your age, assets, and favorite pet.\n");
scanf("%d %f", &age, &assets);
// 這裡要使用&
scanf("%s", pet);
// 字元數組不使用&
printf("%d $%.2f %s\n", age, assets, pet);
%i和%d的差別:
在printf裡面沒差別
在scanf裡面:%d隻比對十進制,%i比對八進制,十進制,十六進制。
緩沖區
緩沖區分為:
完全緩沖:填滿重新整理緩沖區,發送内容。常用于檔案。大小取決于系統。
行緩沖:遇到換行符重新整理。常用于鍵盤輸入,Enter。
無緩沖:有些系統輸入立即輸出。
輸入緩沖區:
隻有當其中的資料讀走的時候,才會清除這個資料。
scanf(資料類型)和緩沖區中的資料類型不一緻的時候,便無法讀走資料,可能導緻死循環。
解決辦法:
scanf("%*[^\n]");
*忽略讀到的内容,[^\n]任何非\n的字元。
scanf調用失敗傳回0。
輸出緩沖區:
程式->輸出緩沖區->螢幕
<1>\n
<2>程式結束
<3>輸出緩沖區滿(4kb)
<4>人工重新整理(fflush)
例子代碼:
#include <Windows.h>
#include <stdio.h>
int main()
{
double d = 1.5e30;
printf("整型:%i\n浮點型:%f\n符号:%c\n",123,45.6,'$');
printf("十六進制%x, 八進制%o\n", 763, 763);
printf("float/double去掉了尾随的0:%g\n",45.6);
printf("**************\n\n");
/////////////指數//////////////////
printf("d as double:%g\n", d);
printf("d as integer:%d\n", d);
printf("d as e:%e\n",d);
//////////////類型轉換/////////////////
printf("**************\n\n");
printf("%d\n", (int)d);
printf("\n****************************************\n\n");
///////////////scanf//////////////////
int age;
float assets;
char pet[30];
printf("Enter your age, assets, and favorite pet.\n");
scanf("%d %f", &age, &assets);
// 這裡要使用&
scanf("%s", pet);
// 字元數組不使用&
printf("%d $%.2f %s\n", age, assets, pet);
printf("\n****************************************\n\n");
////////////////printf////////////////
printf("%d\n",7);
printf("%4d\n",7);//數字占四個位置
printf("%-4d\n",7);//-表示數字左對齊
printf("%04d\n",7);//沒有占滿的位置用0
printf("%d,%c\n",'a','a');//字元類型資料%c,字元用ASCLL碼表存儲,%c的時候編譯器會去查表。%d則直接輸出數字。
printf("%f\n",1.5f);//浮點類型資料用%f
printf("%5.2\n",1.5f);//一共占五個位置,小數點占後兩位
printf("%lf\n",1.5);//雙精度浮點數用%lf表示
system("pause");
return 0;
}