# C語言教學04 - 格式化輸入輸出
## 撰寫於2018年9月
[現代C語言小心得](https://hackmd.io/s/HJPpJjvw7)
## 格式化字元
格式化字元都是由「%」百分比符號開始。以下列舉常用者,有些現在不曉得是什麼的東西,以後會再闡述。
### 正負號
|符號|用途|
|:-:|--|
|\+ |強制顯示正負號|
|空格|假如非負號時顯示空格|
### 顯示精度
| 符號|用途 |
| :--------: | :-------- |
| # | 數字代表顯示的位數,若數字不夠,則以空白補齊 |
| 0 | 修飾顯示的位數,若數字不夠,在左側補零對齊|
| .# | 小數點後的數字代表double的小數後精度|
### 變數長度修飾
變數長度修飾加在型別前
| 字元 | 解釋 |
|:-: |:-----|
|hh |修飾int型別,代表signed char或unsigned char|
|h |修飾int型別,代表short int或unsigned short int|
|l(ell)|修飾所有型別,對於浮點類型無意義,對於int成為long int或unsigned long int|
|ll |修飾int型別,代表long long int或unsigned long long int|
|L |修飾double,代表long double|
|j |修飾int型別,代表intmax_t或uintmax_t型別|
|t |修飾int型別,代表ptrdiff_t型別|
|z |修飾int型別,代表size_t型別|
### 型別字元
| 字元 | 解釋 |
|:-: |:-----|
|d | int類別,十進位|
|i | int類別,輸入時判斷進位法 |
|u | unsigned int,十進位|
|o | unsigned int,八進位|
|x, X | unsigned int,十六進位|
|f | double |
|e | double 科學記號 |
|c | char 型別用Ascii印出|
|s | char陣列(字串) |
|p | void指標 |
|% | 就是一個百分比符號|
## printf 格式化標準輸出
我們試用一下
```C=
#include <stdio.h>
int main() {
int a = 10;
printf("Hello %+d\n", a);
printf("%10d\n", a);
printf("%010d\n", a);
unsigned long long int b = 20L;
printf("Hi %llu\n", b);
printf("Aloha %llx\n", b);
double c = 3.14;
printf("%f\n", c);
printf("%e\n", c);
printf("%.1f\n", c);
printf("%d, %llu, or %f\n", a, b, c);
return 0;
}
```
執行結果
```
Hello +10
10
0000000010
Hi 20
Aloha 14
3.140000
3.140000e+00
3.1
10, 20, or 3.140000
```
## scanf 標準格式化輸入
其實差不多,但是有差異
```C=
#include <stdio.h>
int main() {
int a;
scanf("%d", &a); // 要加&,address of operator 取址運算子
printf("Hello%x\n", a);
}
```
:::danger
**scanf**這裡要加取址運算子&,否則會造成電腦大暴走。原因會在以後闡述。
:::
假如輸入23
```
23[Enter]
Hello17
```