C語言-輸入與輸出

簡介

在C語言裡面,標準的輸入輸出是由標頭檔stdio所提供的

這也是為什麼程式最開始都要寫#include的原因

stdio是standard input/output的縮寫

裡面規範了所有關於輸入輸出的函數與規定

getchar、putchar

如果只想取得使用者輸入的字元,可以使用getchar(),這函數會直接取得使用者的輸入並回傳

如果只要輸出一個字元,可以使用putchar(),這函數會將一個字元顯示在螢幕上

以下是getchar、putchar範例程式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
int main(void) {
char c;
printf("請輸入一個字元:");
c = getchar();
putchar(c);
putchar('\n');
return 0;
}

執行結果

請輸入一個字元:X
X

gets、puts

如果你輸入超過兩個字元,getchar()只會讀取第一個字元,並將其餘字元留在緩衝區,只到下一次的getchar()

如果一次輸入多個字元,也就是字串,可以使用gets(),這函數會取得使用者輸入的字串,不包括按下enter的換行符號

而想將輸入的字串一次輸出的話,可以使用puts(),這函數會輸出文字後並且換行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
int main(void) {
char str[20];// 宣告可以輸入20字以內的字串,在之後的章節會介紹
puts("請輸入字串:");
gets(str);
puts("輸入的字串為:");
puts(str);
return 0;
}

執行結果

請輸入字串:
Hello
輸入的字串為:
Hello

scanf、printf

如果你想輸入其他型態的數值,那就需要使用scanf,搭配格式指定字與取址運算子(&)指定數值給變數

以下是格式指定字跟說明

格式指定字 說明
%c 字元
%d 整數(10進位)
%o 整數(8進位)
%u 無號整數
%x, %X 整數(16進位)
%f 單精度浮點數
%lf 雙精度浮點數
%s 字串

以下是輸入的範例程式

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
int main(void) {
int input;
printf("請輸入數字:");
scanf("%d", &input);
printf("您輸入的數字:%d\n", input);
return 0;
}

執行結果

請輸入數字:100
您輸入的數字:100

scanf可以一次指定多個值,也可以指定輸入的格式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
int main(void) {
int number1, number2;
printf("請輸入兩個數字,中間使用空白區隔):");
scanf("%d %d", &number1, &number2);
printf("您輸入的數字總和:%d + %d = %d\n", number1, number2,number1+number2);
printf("請輸入兩個數字,中間使用*號區隔):");
scanf("%d*%d", &number1, &number2);
printf("您輸入的數字相乘為:%d * %d = %d\n", number1, number2,number1*number2);
return 0;
}

執行結果

請輸入兩個數字,中間使用空白區隔):10 1
您輸入的數字總和:10 + 1 = 11
請輸入兩個數字,中間使用*號區隔):5*2
您輸入的數字相乘為:5 * 2 = 10

如果想輸入字串以外的數值,就需要使用printf來顯示,函數執行過後會回傳輸出的字元數

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
int main(void) {
int count = printf("Hello World!\n");
printf("%d\n", count);
return 0;
}

執行結果

Hello World!
13

包括空白與換行總共13個字元被顯示在螢幕上

printf也需要格式指令碼來幫忙輸出

格式指定字 說明
%c 字元
%d 整數(10進位)
%o 整數(8進位)
%u 無號整數
%x, %X 整數(16進位)
%f 浮點數輸出
%e, %E 使用科學記號顯示浮點數
%g, %G 浮點數輸出,取%f或%e(%f或%E),看哪個表示精簡
%% 顯示 %
%s 字串

基本上什麼型態就需要對應的格式指令碼,以下是格式指令碼範例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
int main(void) {
printf("字元 %c\n", 'A');
printf("字元編碼 %d\n", 'A');
printf("字元編碼 %c\n", 65);
printf("十進位整數 %d\n", 15);
printf("八進位整數 %o\n", 15);
printf("十六進位整數 %X\n", 15);
printf("十六進位整數 %x\n", 15);
printf("科學記號 %f\n", 0.001234);
printf("科學記號 %e\n", 0.001234);
printf("科學記號 %g\n", 0.000000001234);
printf("科學記號 %g\n", 0.1234);
return 0;
}

執行結果

字元 A
字元編碼 65
字元編碼 A
十進位整數 15
八進位整數 17
十六進位整數 F
十六進位整數 f
科學記號 0.001234
科學記號 1.234000e-003
科學記號 1.234e-009
科學記號 0.1234

另外輸出的細節,例如指定小數點輸出到第幾位,就要寫%.2f,表示輸出到小數點以下第二位

若在前面加個數字表示要輸出多少寬度,例如%10.2f表示預留10個字元寬度,不足部分補上空白

如果在前面加上負號,表示向左對齊,否則向右對齊,例如:

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
int main(void) {
printf("example:%10.2f\n", 3.14159);
printf("example:%-10.2f\n", 3.14159);
return 0;
}

執行結果

example:      3.14
example:3.14

字元寬度也可以由變數指定,例如%*d,而之後的第一個引數就會成為字元寬度

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int width,num;
printf("請輸入字元寬度:");
scanf("%d",&width);
printf("請輸入數字:");
scanf("%d",&num);
printf("num = %*d\n", width, num);
return 0;
}

執行結果

請輸入字元寬度:5
請輸入數字:100
num =   100

參考

  1. C語言
  2. putchar()、getchar()、puts()、gets()
  3. printf() 與 scanf()