《學會 C 語言》學習筆記(五):基本輸入與輸出

前言

本文為《學會 C 語言》一書的學習筆記。

主控台輸入與輸出

C 語言最常使用的標準輸入裝置是鍵盤,標準輸出裝置是電腦螢幕,即所謂的主控台輸入輸出(Console I/O)。

C 語言的標準輸入與輸出是使用文字模式的輸入與輸出,這是循序一行一行組成的文字串流,每一行是由新行字元 \n 結束。

輸入與輸出整數

使用 scanf() 函數讀取整數,使用 printf() 函數將整數輸出。

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>

int main()
{
int var1;
printf("請輸入整數 =>");
scanf("%d", &var1);
printf("整數值 = %d\n" , var1);

return 0;
}
  • scanf() 函數的格式字元 %d 代表資料型態是整數。
  • scanf() 函數使用第一個參數的格式字元對應第二個參數的變數,變數之前使用 & 取址運算子,可以取得變數的記憶體位址。
  • printf() 函數輸出整數,格式字元是 %d

輸入與輸出浮點數

使用 scanf() 函數讀取浮點數,使用 printf() 函數將浮點數輸出。

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>

int main()
{
double var1;
printf("請輸入浮點數 =>");
scanf("%lf", &var1);
printf("浮點數值 = %f\n" , var1);

return 0;
}
  • scanf() 函數的格式字元如果是 %lf 代表資料型態是 double
  • scanf() 函數的格式字元如果是 %f 代表資料型態是 float
  • scanf() 函數使用第一個參數的格式字元對應第二個參數的變數,變數之前使用 & 取址運算子,可以取得變數的記憶體位址。
  • printf() 函數不論輸出 doublefloat,格式字元都是 %f

輸入與輸出字串

使用 scanf() 函數讀取字串(無法讀取空白字元),使用 printf() 函數將字串輸出。

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>

int main()
{
char var1[80]; // 大小是 80 個字元
printf("請輸入字串 =>");
scanf("%s", var1);
printf("字串值 = %s\n" , var1);

return 0;
}
  • scanf() 函數的格式字元 %s 代表資料型態是字串。
  • C 語言的字串是 char 型態的一維陣列。
  • C 語言的陣列名稱本身就是位址,所以不需要在之前使用 & 取址運算子。
  • printf() 函數輸出整數,格式字元是 %s

使用 gets() 函數讀取輸入字串(可以讀取空白字元),使用 puts 函數將字串輸出。

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>

int main()
{
char var1[80];
printf("請輸入字串 =>");
gets(var1);
printf("輸出字串 : ");
puts(var1);

return 0;
}
  • gets() 函數可以從標準輸入裝置讀取整行文字內容的字串。

輸入與輸出單一字元

使用 getchar() 函數讀取單一字元(使用緩衝區),使用 putchar() 函數將單一字元輸出。

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>

int main()
{
char ch;
printf("請輸入字元 =>");
ch = getchar();
putchar(ch);

return 0;
}

使用 getch() 函數讀取單一字元(沒有使用緩衝區),使用 putchar() 函數將單一字元輸出。

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
#include <conio.h>

int main()
{
char ch; /* 變數宣告 */
printf("請輸入字元 =>");
ch = getch(); /* 讀取字元 */
putchar(ch); /* 輸出字元 */
putchar('\n'); /* 換行 */
return 0;
}
  • getch() 函數沒有使用緩衝區,也不會產生回應,讀取到字元會馬上送給 C 程式進行處理。

輸入與輸出多種型態

使用 scanf 函數可以讀取多筆不同型態的資料,例如:

1
scanf("%f, %d, %f", &x, &y, &z);

空白字元

scanf() 函數的格式字串可以使用空白字元,如跳脫字元 \t(水平定位符號)、 \n(換行符號)等。使用者在輸入資料時,只需間隔一個空白字元即可(最多也只會視為一個)。

1
2
3
4
"%f%d" // 23.5 45
"%f %d" // 23.5 45
"%f\t%d" // 23.5 45
"%f\n%d" // 23.5 45

非空白字元

在格式字串如果擁有非空白字元,使用者在輸入資料時,也需要同時包含這些非空白字元。

1
2
3
"%f, %d, %f" // 23.5, 45, 10.2
"%f\'%d\'%f" // 23.5'45'10.2
"%f*%d*%f" // 23.5*45*10.2

格式字元

scanf() 函數的格式字串中一定需要格式字元,一個格式字元對應一種資料型態。

格式字元 說明
%d 整數
%f 浮點數(float)
%lf 浮點數(double)
%s 字串
%e 科學符號的數値
%u 無符號整數
%o 八進制整數
%x 十六進制整數

在 C 程式使用 scanf() 函數同時輸入多個數値資料。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>

int main()
{
float x, z;
int y;
printf("請第1次輸入x, y, z的值: ");
scanf("%f, %d, %f", &x, &y, &z);
printf("1: x= %f y= %d z= %f\n", x, y, z);
printf("請第2次輸入x, y, z的值: ");
scanf("%f, %d, %f", &x, &y, &z);
printf("2: x= %f y= %d z= %f\n", x, y, z);
printf("請第3次輸入x, y, z的值: ");
scanf("%f, %d, %f", &x, &y, &z);
printf("3: x= %f y= %d z= %f\n", x, y, z);

return 0;
}

參考資料

  • 陳會安(2016)。學會 C 語言。台北市:旗標。