我要學會 C 語言(四):輸入與輸出好好玩

要讓程式和使用者互動,不透過輸入和輸出怎麼行呢?

輸入和輸出其實有很多種,例如語音輸入、發出聲音、震動,甚至是讀取、寫入檔案(應該後面的章節會解釋)。不過一開始,我們先從最基本的開始玩:螢幕的輸入和輸出

在 C 語言裡面,螢幕輸入和輸出是一種標準的輸入輸出:Standard Input and Output,我們幾乎每次都會引用的標頭檔 stdio.h 的 stdio 就是它的縮寫。

螢幕輸出

還記得 Hello World! 的時候,我們用了 printf 函式嗎?沒錯,printf 函式就是用來輸出的。基本用法:

printf("要輸出的文字");

然後你就會得到要輸出的文字了。

為什麼要用 " " 包起來?在程式語言來說,用雙引號包起來的代表字串、用單引號包起來的代表字元,字串就是多個字元的意思;而 printf 的功能其實是輸出字串。別擔心,字串的概念會在之後的章節再講一次。

不過 printf 沒那麼簡單,還記得我說過 printf 後面的 f 代表 formatted 嗎?printf 裡面還是可以填入各種格式的,比方說跳脫字元,例如 \n 代表換行,所以每輸出一個 \n 就會換行一次,例如:

printf("這是第一行\n\n這是第四行");

你會得到:

這是第一行

這是第四行

常見的跳脫字元有:

  • \n:用來換行
  • \t:用來縮排(等同於輸出一個 tab)
  • \’:用來輸出一個單引號
  • \”:用來輸出一個雙引號
  • \:用來輸出一個反斜線

其他其實平常用不太到,就不多說以免造成困擾。而為了避免字元裡面含有單引號、字串裡面含有雙引號,或是含有反斜線,所以這三個會特別弄成跳脫字元。如果不懂我在說什麼,可以想想看如果你不用跳脫字元要怎麼用 printf 輸出一個雙引號,你就懂了 XD

另外,在變數運算的章節也提過 %d,%d 的用途就是來輸出變數的內容。例如:

#include <stdio.h>
 
int main(){
	int a=4;
	printf("%d", a);
	return 0;

}

你會得到一個 4。

如果要輸出多個變數的話,可以這麼做:

#include <stdio.h>
 
int main(){
	int a=4, b=7;
	printf("%d\n%d", a, b);
	return 0;
}

你會得到:

4
7

「噢噢,所以只要前面用 %d,後面用逗點跟變數名稱就好了嗎?」

如果這麼方便,就不用花一篇文章講資料型態了(笑)。要用 printf 的話,會因為不同的資料類型,前面要放的東西不一樣,常見的有:

  • %d:顯示整數(十進位,d 是 decimal 的意思)
  • %o:顯示整數(八進位,octal)
  • %x:顯示整數(十六進位,heximal)
  • %c:顯示字元
  • %f:顯示浮點數
  • %e:顯示浮點數(以科學記號方式表示)
  • %lld:顯示長整數
  • %s:顯示字串
  • %%:顯示一個 % 符號

下面這個例子示範了如何顯示字元、整數、浮點數,以及一個整數的八進位和十六進位如何表示。

#include <stdio.h>
int main(){
	int a=23;
	float b=9.2;
	char c='A';
	printf("%d\n", a);
	printf("%o\n", a);
	printf("%x\n", a);
	printf("%f\n", b);
	printf("%c\n", c);
	return 0;
}

輸出結果:

23
27
17
9.2
C

另外,printf 還可以調整一些輸出的細節。

如果要指定小數點輸出位數,可使用 %.2f (輸出到小數點第二位)。

如果要指定輸出的總位數(不含小數點),可使用 %3d (總共輸出三位,不足會以空白補齊)。

也可以指定輸出總位數,並在前面補零,使用 %08d (總共輸出八位,不足會以零補齊)。

總位數和小數點也能搭配使用,例如 %5.3f (小數點以下三位,小數點以上兩位)。

螢幕輸入

螢幕輸入的時候使用 scanf 函式。例如:

#include <stdio.h>
int main(){
	int input;
	scanf("%d", &input);
	return 0;
}

就可以把使用者輸入的值存到變數 input 裡面。

scanf 也是 scan 和 formatted 的縮寫,所以 scanf 的用法和 printf 幾乎一模一樣。但比較需要注意的是:

  • scanf 裡面絕對不要包含 \n
  • scanf 後面不是直接放變數,而是要加上一個 &

這兩點都很重要,因為做錯這兩點在編譯的時候不會出錯,但在執行上卻不是自己想要的結果,所以常常會因為做錯這兩件事情而找錯誤找半天。不如剛開始就養成好習慣,不要犯這兩個錯誤!

至於為什麼 scanf 要搭配 &,等到後面指標的章節會再詳細講解。

如果要一次輸入多個變數的話,通常中間會以空白分隔:

#include <stdio.h>
int main(){
	int a;
	int b;
	float c;
	scanf("%d %d %f", &a, &b, &c);
	return 0;,
}

這樣就能把多個值放到多個變數裡面,記得整數要搭配 %d、浮點數要搭配 %f …… 等等。

輸出與輸入

學會輸出和輸入後,就可以來做一點互動的事情啦!試著從零開始寫個簡易乘法計算機吧!

首先,我們一個程式裡一定會有主程式,所以先把 main 函式的部分補齊吧:

#include <stdio.h>
int main(){
	
	return 0;,
}

接著乘法需要一個被乘數、一個乘數,所以需要兩個變數來存放。至於資料型態呢?可以先使用整數就好。

#include <stdio.h>
int main(){
	int multiplicand, multiplier;
	return 0;,
}

然後要讓使用者輸入兩個整數,放到兩個變數 multiplicand、multiplier 裡面,使用 scanf 函式。

#include <stdio.h>
int main(){
	int multiplicand, multiplier;
	scanf("%d %d", &multiplicand, &multiplier);
	return 0;,
}

把值存到變數以後,接下來就是把兩個值乘起來並輸出囉。

#include <stdio.h>
int main(){
	int multiplicand, multiplier;
	scanf("%d %d", &multiplicand, &multiplier);
	printf("%d", multiplicand * multiplier);
	return 0;,
}

這樣看起來已經沒有什麼問題了。不過還有沒有辦法讓它更完善呢?如果你真的有跟著編譯的話,你會發現,程式一打開是空白的,會等待使用者輸入,這時不妨提示使用者應該輸入什麼。

可以在 scanf 之前加入一個 printf ,請使用者輸入一個被乘數和乘數:

#include <stdio.h>
int main(){
	int multiplicand, multiplier;
	printf("請輸入被乘數和乘數,中間以空白分隔:");
	scanf("%d %d", &multiplicand, &multiplier);
	printf("%d", multiplicand * multiplier);
	return 0;,
}

到這邊,我們已經一步一步建構出一個簡單的程式了。等到下一章,搭配 if 來使用,讓你的程式在不同情況做不同事情,會更有成就感的!

我要學會 C 語言 目錄