我要學會 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 來使用,讓你的程式在不同情況做不同事情,會更有成就感的!