1. 程式人生 > >【C語言】printf函式和scanf函式典型例子

【C語言】printf函式和scanf函式典型例子

<span style="font-size:18px;">#include <stdio.h>

void main()
{
	int i;
	char c;
	for(i=0; i<5; ++i)
	{
		scanf("%d",&c);
		printf("%d ",i);
	}
	printf("\n");
}</span>

       表面上,這個程式從標準輸入裝置讀入5個數,在標準輸出裝置上寫5個數:0    1    2    3    4 。

       實際上,這個程式並不一定得到上面的結果。例如在某個編譯器上,它的輸出是:0    0    0    0    0    1    2    3    4   。

       問題的關鍵在於,這裡c被宣告為char型別,而不是int型別。當程式要求scanf讀入一個整數,應該傳遞給它一個指向整數的指標。而程式中scanf函式得到的卻是一個指向字元的指標,scanf函式並不能分辨這種情況,它只是將指向這個字元的指標作為指向整數的指標而接受,並且在指標指向的位置儲存一個整數。因為整數所佔的儲存空間要大於字元所佔的儲存空間,所以字元附近的記憶體將被覆蓋。

       字元c附近的記憶體中儲存的內容是由編譯器決定的,本例中它存放的是整數i的低端部分。因此,每次讀入一個數值到c時,都會將i的低端部分覆蓋為0,而i的高階部分本來就是0,相當於i每次都被重新設定為0,迴圈將一直進行。當到達檔案的結束位置後,scanf函式不再試圖讀入新的數值到c。這時,i才可以正常地遞增,最後終止迴圈。