基本輸入與輸出 王振生
C語言的控制台輸入與輸出 以C語言建立的控制台應用程式(Console Application)來說,最常使用的標準輸入裝置是鍵盤,標準輸出裝置是電腦螢幕,即所謂的控制台輸入與輸出(Console Input and Output,簡稱Console I/O),如下圖所示:
格式化的資料輸入(P 3-7) C語言的格式化資料輸入函數,可以在C程式讓使用者輸入字元、數值或字串值。在C語言標準函式庫<stdio.h>標頭檔提供2個函數執行格式化的資料輸入和輸出,如下表所示:
使用scanf()函數讀取數值資料 scanf("%d", &age); scanf("%f", &score); 在scanf()函數的格式字串是使用格式字元判斷輸入哪一種資料型態,函數的傳回值是整數int,如果資料讀取成功,傳回輸入的資料數,如果失敗傳回0。例如:使用格式字元%d和%f讀取整數和浮點數值,如下所示: scanf("%d", &age); scanf("%f", &score); 第1列程式碼的格式字串內含%d表示輸入整數,第2個參數使用「&」取址運算子取得變數的記憶體位址,第2列的程式碼是使用%f格式字元讀取浮點數。
讀取多種不同型態的資料(P 3-7) 在同一個scanf()函數可以讀取多筆不同資料型態的資料,如下所示: scanf("%f,%d,%f", &x, &y, &z); 上述程式碼的格式字串擁有%f、%d和%f一共3個格式字元,之後也擁有對應的3個變數&x、&y和&z讀取3筆資料,分別是浮點數、整數和浮點數資料,如下圖所示:
讀取多種不同型態的資料-空白字元 在scanf()函數的格式字串可以使用空白字元,空白字元是指Space或Escape逸出字元的'\t'、'\n'等,這些字元並沒有用處,scanf()函數並不會處理這些字元,例如:一些空白字元的範例,如下所示: "%f%d" "%f %d" "%f\t%d" "%f\n%d"
讀取多種不同型態的資料-非空白字元 在格式字串如果擁有非空白字元,使用者在輸入資料時,就需包含這些非空白字元。例如:非空白字元範例,如下所示: "%f,%d,%f" /* 23.5,45,10.2 */ "%f\’%d\’%f" /* 23.5’45’10.2 */ "%f*%d*%f" /* 23.5*45*10.2 */ 格式字串中可以使用「,」、「’」和「*」等字元來分隔,所以輸入3個資料也需要包含此字元,之後的註解文字是輸入範例。
上課練習程式 #include <stdio.h> #include <stdlib.h> #include <limits.h> #include <float.h> int main(void) { int balance; char name; float a; double b; balance = 5000; name = 'c'; printf("請輸入攝氏溫度:"); scanf("%f", &a); b = (9.0 * a) / 5.0 + 32.0; printf("%c(%d)\n", name, sizeof(char)); printf("%d(%d)\n", balance, sizeof(int)); printf("%f(%d)\n", a, sizeof(float)); printf("%f(%d)\n", b, sizeof(double)); system("PAUSE"); return 0; }
printf()函數的最小欄寬及精確度(P 3-24) %[最小欄寬][.精確度]格式字元
printf()函數的最小欄寬(P 3-19) printf()函數格式字元「%」符號後,字元前可以加上最小欄寬的整數值,表示輸出變數值最少會顯示出指定欄寬的字元數,如果輸出的長度小於欄寬,則向右靠齊,然後在左邊填入空白字元,如下所示: printf("i(3d) = [%3d]\n", i); printf("i(7d) = [%7d]\n", i); printf("i(10d) = [%10d]\n", i); 上述程式碼的格式字串分別指定最小欄寬3、7和10顯示整數變數i的值2046。
printf()函數的最小欄寬(P 3-19)
printf()函數的精確度(P 3-21) printf()函數的精確度是使用在浮點數和字串剪裁,例如:%f、%e預設的精確度為小數點下6位數,printf()函數可以調整輸出資料的精確度,如下所示: printf("f(.0f) = [%.0f]\n", f); printf("f(.3f) = [%.3f]\n", f); printf("f(12.3f) = [%12.3f]\n", f); printf("f(12.5f) = [%12.5f]\n", f); 上述程式碼的格式字元中,在「.」小數點前是最小欄寬,之後是精確度,變數f的值為3.1415926535898。
printf()函數的精確度-範例
printf()函數的精確度-動態指定 如果需要動態指定輸出資料的精確度或最小欄寬,可以使用整數常數或變數值指定,在格式字串是使用「*」星號代表精確度和最小欄寬,如下所示: 程式碼的格式字串使用「*」星號指定浮點數的精確度和最小欄寬,在格式字串擁有一個星號,在之後的參數也需要新增對應的變數或常數值,變數f的值為3.1415926535898。
printf()函數的精確度-動態指定範例