天天看點

格式化輸入輸出

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;
}



           

繼續閱讀