程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 基礎:C語言裡的printf()與scanf()

基礎:C語言裡的printf()與scanf()

編輯:關於C語言

printf()函數

1. 參數傳遞

參數傳遞的機制隨實現不同而不同,下面是參數傳遞在系統中的工作原理。函數調用如下:

printf("%ld %ld %ld %ld",n1,n2,n3,n4);
//設n1為float型 n2為double型 n3,n4為long型

該調用告訴計算機把變量n1,n2,n3,n4的值傳遞給計算機,計算機把它們放置到被稱為對戰(stack)的一塊內存區域中來實現。計算機根據變量的類型而非轉換說明符(%ld)把這些值放置到堆棧中。所以,n1在堆棧中占用8個字節(float被轉換成了double)。同樣,n2占用8個字節,而n3和n4則分別占用4個字節。讓後控制轉移到printf()函數。

該函數從堆棧把值都出來,但在讀取時,他根據轉換說明符去讀取。%ld說明符指出,printf()應該讀取4個字節,所以printf()在堆棧中讀取前4個字節作為他的第一個值。這就是n1的前半部分,他被解釋成一個長整數(long integer)。下一個%ld說明符在讀取4個字節;這就是n1的前半部分,他被解釋成第二個長整型(long integer)。同樣,%ld的第三個和第四個實例使得n2的前半部分和後半部分被讀出,並被解釋成兩個長整型(long integer)。所以,雖然n3和n4的說明符都正確,但是printf()仍然讀取了錯誤的字節。

2. printf()的返回值

返回所打印的字符的數目,如果有錯誤輸出,那麼printf()會返回一個負數(printf()的一些老版會有不同的返回值)。

應用舉例:

#include
main()
{
	int a=100;
	float b=123.255;
	printf("a=%d ",a);
	printf("a=d ",a);
	printf("a=%-10d ",a);
	printf("a=%+d ",a);
	printf("a=% d ",a);
	printf("a=%#o ",a);
	printf("a=%#x ",a);
	printf("b=%#f ",b);
}
/*
運行結果
a=100
a=       100
a=100
a=+100
a= 100
a=0144
a=0x64
b=123.254997  (????)
*/

輸出最小寬度:用十進制整數來表示輸出的最少位數。(至少要輸出這麼多位!)若實際位數多於定義的寬度:則按實際位數輸出。若實際位數少於定義的寬度:則右對齊,左邊留空。有負號,左對齊,右邊留空表示寬度的數字以0開始,則右對齊,左邊留空。

#include <stdio.h>
main()
{
	int a=3456;
	printf("a=%3d ",a);    //若實際位數多於定義的寬度:則按實際位數輸出
	printf("a=d ",a);   //若實際位數少於定義的寬度:則右對齊,左邊留空
	printf("a=%-10d ",a);  //若實際位數少於定義的寬度:有負號,左對齊,右邊留空
	printf("a=0d ",a);  //若實際位數少於定義的寬度:表示寬度的數字以0開始,則右對齊,左邊留空
	printf("a=%-010d ",a); //左對齊,0無意義。
}
/*
運行結果:
a=3456
a=      3456
a=3456
a=0000003456
a=3456
*/

scanf()函數

此函數可以讀取各式各樣的數據。它把輸入的字符串轉換成各種形式:整數,浮點數,字符和C的字符串。

1. 使用scanf()函數

scanf()函數使用空格(換行,制表符和空格)來決定怎樣把輸入分成幾個字段。他一次把轉換說明與字段相匹配,並跳過他們之間的空格。

例:

int age;
int assets;
scanf("%d %f",&age,&assets);

我們可以分兩行進行輸入。同樣,也可以分一行或5行輸入,只要在每個輸入項目之間至少鍵入一個換行符,空格或者制表符。唯一例外的就是%c說明,即使下一個字符是空白字符,它也會讀取那個字符。 

2. 從scanf()的角度看輸入

我們在仔細地研究scanf怎樣讀取輸入,假設您使用了一個%d說明符來讀取一個整數。scanf()函數開始每次讀取一個輸入字符,它跳過空白字符(空格,制表符和換行符)直到遇到一個非空白字符。因為他試圖讀取一個整數,所以scanf()期望發現一個數字字符或者一個符號(+或者-)。

如果遇到了一個非數字的字符,他就得出結論:已讀到了整數的尾部。scanf()把這個非數字字符放回輸入緩沖區。這就意味著當程序下一次開始讀取輸入時,它將從前面被放棄的那個非數字字符開始。最後,scanf()計算讀取到的數字的相應數組,並將該值放到指定的變量中。

如果第一個非空白字符不是數字,將會發生什麼呢?比如說,是A而非一個數字?這時scanf()會停在那裡,並把A(或者不管什麼)放回輸入。沒有把任何值賦給指定的變量,程序下一次讀取輸入時,它就在A處重新開始。如果程序中只有%d這個說明符,scanf()永遠也不會越過那個A去讀下一個。而且,如果您使用帶有多個說明符的scanf()語句,ANSI C 要求函數在第一個出錯的地方停止讀入輸入。

如果使用%s說明符,那麼空白字符(空格,回車,制表符)以外的所有字符都是可接受的,所以scanf()跳過空白字符直到遇到第一個非空白字符,然後保存再次遇到空白字符之前的所有非空白字符。這就意味著%s 是scanf()讀取一個單詞,也就是說,一個不包含空白字符的字符串。如果使用字段寬度,scanf()在字段的結尾或者第一個空白字符處停止。不能通過字段寬度使得scanf()用一個%s說明符讀取多於一個字的輸入。最後一點:當scanf()把字符串放在一個指定的數組中,他添加終止的''使得數組內容成為一個C字符串。

如果使用%c說明符,那麼所有的輸入字符都是平等的。如果下一個輸入字符是一個空格或者換行符,將會把這個空格或者換行符賦給指定的年齡;不會跳過空白字符。

3. scanf()的返回值

返回成功讀入的項目的個數。如果他沒有讀取任何項目(當它期望一個數字而您卻鍵入一個非數字字符串時就會發生這種情況),scanf()會返回值0。當他檢測到“文件結尾”是,他返回EOF(EOF是在文件stdio.h中定義的特殊值。一般#define指令把EOF的值定義為-1)。

main() 
{ 
	int i; 
	char *p, str[20]; 
	scanf("%d", &i); 
	scanf("%s", p);          /*從健盤輸入字符串*/ 
	scanf("%s", str); 
	printf("i=%d ",i); 
	printf("%s ", p);       /*向屏幕輸出字符串*/ 
	printf("%s ", str); 
} 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved