輸入輸出函數(printf 和 scanf)是C語言中非常重要的兩個函數,也是學習C語言必學的兩個函數。在C語言程序中,幾乎沒有一個程序不需要這兩個函數,尤其是輸出函數(printf),所以這兩個函數必須要掌握。
如果在程序中要使用 printf 或者 scanf,那麼就必須要包含頭文件 stdio.h。因爲這兩個函數就是包含在該頭文件中的。
輸出函數的功能是將程序運行的結果輸出到屏幕上,而輸入函數的功能是通過鍵盤給程序中的變量賦值。可以說輸入輸出函數是用戶和計算機交互的接口。其中 printf 的功能很強大,用法很靈活,比較難掌握;而 scanf 的用法相對比較固定,但也有很多需要注意的地方。
本節我們先講解 printf 的用法,稍後再講解 scanf。
printf 的格式
printf 函數的原型爲:
# include <stdio.h>
int printf(const char *format, ...);
在講每一個函數的時候都會先把它的函數原型寫出來,這個原型你們現在看不懂不要緊,等到學完C語言之後再來看這個原型就會發現它是很有參考意義的!它對深刻理解函數有着很大的價值。
printf 的格式有四種:
1) printf("字符串\n");
# include <stdio.h>
int main(void)
{
printf("Hello World!\n"); // \n表示換行
return 0;
}
其中\n
表示換行的意思。它是一個轉義字符,前面在講字符常量的時候見過。其中 n 是“new line”的縮寫,即“新的一行”。
此外需要注意的是,printf 中的雙引號和後面的分號必須是在英文輸入法下。雙引號內的字符串可以是英文,也可以是中文。
2) printf("輸出控制符",輸出參數);
# include <stdio.h>
int main(void)
{
int i = 10;
printf("%d\n", i); /*%d是輸出控制符,d 表示十進制,後面的 i 是輸出參數*/
return 0;
}
這句話的意思是將變量 i 以十進制輸出。
那麼現在有一個問題:i 本身就是十進制,爲什麼還要將 i 以十進制輸出呢?
因爲程序中雖然寫的是 i=10,但是在內存中並不是將 10 這個十進制數存放進去,而是將 10 的二進制代碼存放進去了。計算機只能執行二進制 0、1 代碼,而 0、1 代碼本身並沒有什麼實際的含義,它可以表示任何類型的數據。所以輸出的時候要強調是以哪種進制形式輸出。所以就必須要有“輸出控制符”,以告訴操作系統應該怎樣解讀二進制數據。
如果是%x
就是以十六進制的形式輸出,要是%o
就是以八進制的形式輸出,大家自己試一下。
3) printf("輸出控制符1 輸出控制符2…", 輸出參數1, 輸出參數2, …);
# include <stdio.h>
int main(void)
{
int i = 10;
int j = 3;
printf("%d %d\n", i, j);
return 0;
}
輸出控制符 1 對應的是輸出參數 1,輸出控制符 2 對應的是輸出參數 2……編譯、鏈接、執行後我們看一下輸出結果:
10 3
注意一下,爲什麼 10 和 3 之間有一個空格?因爲上面 %d 和 %d之間有空格,printf 中雙引號內除了輸出控制符和轉義字符\n
外,所有其餘的普通字符全部都原樣輸出。比如:
# include <stdio.h>
int main(void)
{
int i = 10;
int j = 3;
printf("i = %d, j = %d\n", i, j);
return 0;
}
這時我們再編譯、鏈接、執行一下:
i = 10, j = 3i=
、,
、空格和j=
全都原樣輸出了。此外需要注意的是:“輸出控制符”和“輸出參數”無論在“順序上”還是在“個數上”一定要一一對應。
4) printf("輸出控制符 非輸出控制符",輸出參數);
這實際上就是上面那個例子。這時候會有一個問題:到底什麼是“輸出控制符”,什麼是“非輸出控制符”?很簡單,凡是以%
開頭的基本上都是輸出控制符。
輸出控制符
常用的輸出控制符主要有以下幾個:
控制符 | 說明 |
---|---|
%d | 按十進制整型數據的實際長度輸出。 |
%ld | 輸出長整型數據。 |
%md | m 爲指定的輸出字段的寬度。如果數據的位數小於 m,則左端補以空格,若大於 m,則按實際位數輸出。 |
%u | 輸出無符號整型(unsigned)。輸出無符號整型時也可以用 %d,這時是將無符號轉換成有符號數,然後輸出。但編程的時候最好不要這麼寫,因爲這樣要進行一次轉換,使 CPU 多做一次無用功。 |
%c | 用來輸出一個字符。 |
%f | 用來輸出實數,包括單精度和雙精度,以小數形式輸出。不指定字段寬度,由系統自動指定,整數部分全部輸出,小數部分輸出 6 位,超過 6 位的四捨五入。 |
%.mf | 輸出實數時小數點後保留 m 位,注意 m 前面有個點。 |
%o | 以八進制整數形式輸出,這個就用得很少了,瞭解一下就行了。 |
%s | 用來輸出字符串。用 %s 輸出字符串同前面直接輸出字符串是一樣的。但是此時要先定義字符數組或字符指針存儲或指向字符串,這個稍後再講。 |
%x(或 %X 或 %#x 或 %#X) | 以十六進制形式輸出整數,這個很重要。 |
%x、%X、%#x、%#X 的區別
一定要掌握 %x(或 %X 或 %#x 或 %#X),因爲調試的時候經常要將內存中的二進制代碼全部輸出,然後用十六進制顯示出來。下面寫一個程序看看它們四個有什麼區別:
# include <stdio.h>
int main(void)
{
int i = 47;
printf("%x\n", i);
printf("%X\n", i);
printf("%#x\n", i);
printf("%#X\n", i);
return 0;
}
在 VC++ 6.0 中的輸出結果:
2f
2F
0x2f
0X2F
從輸出結果可以看出:如果是小寫的x
,輸出的字母就是小寫的;如果是大寫的X
,輸出的字母就是大寫的;如果加一個#
,就以標準的十六進制形式輸出。
最好是加一個#
,否則如果輸出的十六進制數正好沒有字母的話會誤認爲是一個十進制數呢!總之,不加#
容易造成誤解。但是如果輸出 0x2f 或 0x2F,那麼人家一看就知道是十六進制。而且%#x
和%#X
中,筆者覺得大寫的比較好,因爲大寫是絕對標準的十六進制寫法。
如何輸出 %d、\ 和雙引號
printf 中有輸出控制符%d
,轉義字符前面有反斜槓\
,還有雙引號。那麼大家有沒有想過這樣一個問題:怎樣將這三個符號通過 printf 輸出到屏幕上呢?
要輸出%d
只需在前面再加上一個%
,要輸出\
只需在前面再加上一個\
,要輸出雙引號也只需在前面加上一個\
即可。程序如下:
# include <stdio.h>
int main(void)
{
printf("%%d\n");
printf("\\\n");
printf("\"\"\n");
return 0;
}
在 VC++ 6.0 中的輸出結果是:
%d
\
""
小結
printf 是C語言中非常重要的一個函數。經過上面的學習我們發現,其實它並不難。只要多編程多練習,很快就能掌握。
其次學完本節之後要知道爲什麼需要“輸出控制符”。因爲計算機中所有的數據都是二進制 0、1 代碼,所以輸出的時候要用“輸出控制符”告訴計算機以什麼形式將二進制數據顯示出來。
輸出控制符中,%d、%f、%s、%c 是最常用的,它們分別是輸出整數、實數、字符串和字符的控制符。%.mf 雖然用得不多,但一定要重視。
最後 %x、%X、%#x、%#X 四種用法的區別只需要瞭解一下即可。