# 輸入輸出
C語言的輸出最常使用的函示是printf()
## printf()
範例1:
輸出Hello world
```cpp=
#include<stdio.h>
int main(){
printf("Hello world");
return 0;
}
```
輸出:
```
Hello world
```
---
範例 2:
輸出一個變數的值加上換行
```cpp=
#include<stdio.h>
int main(){
int a=10;
printf("%d\n",a);
return 0;
}
```
輸出:
```
10
```
---
`" "`(雙引號)使要輸出的字串
我們來解釋一下範例二的第五行
---
### %?
它的作用是將變數的數值轉換為指定的格式輸出
C語言常用的指定格式化輸出
`%d` -> int(整數)
`%ld` -> long(長整數)
`%lld` -> longlong(長整數)
`%f` -> float(浮點數)
`%lf` -> double(浮點數)
`%c` -> char(字元)
`%s` -> string(字串)
後面擺的變數都是有順序的,第一個%?對應到第一個變數
舉例:
```c
#include<stdio.h>
int main(){
int a=10;
float b=1.5;
char c='A';
printf("a=%d b=%3f c=%c",a,b,c);
return 0;
}
```
輸出:
```
a=10 b=1.500000 c=A
```
---
補充:
%<font color=#FF0000>9</font>d 欄位長度
%<font color=#FF0000>0</font>7f 空白處填0
%<font color=#FF0000>-</font>3d 向左對齊
%<font color=#FF0000>+</font>5d 正負號顯示
%<font color=#FF0000>_(我是空格)</font>6f 數值為正的時候留空,數值為負填負號
%4<font color=#FF0000>.3</font>d 小數點後顯示的位數
舉例:
```c=
#include<stdio.h>
int main(){
int a=100;
float b=10.5132;
printf("%9d\n",a);
printf("%09d\n",a);
printf("%-3d\n",a);
printf("%+3d\n",a);
printf("% 6f\n",b);
printf("%.3f\n",b);
return 0;
}
```
輸出:
```
100
000000100
100
+100
10.513200
10.513
```
---
### 跳脫字元

---
## scanf()
C語言的輸入最常使用的函示是scanf()
舉例
```c=
#include<stdio.h>
int main(){
int a;
scanf("%d",&a);
printf("%d",a);
return 0;
}
```
輸入
```
10
```
輸出
```
10
```
一樣都要加雙引號
---
解釋開始
### &
這個為<font color=#FF0000>取址運算子</font>,可以將變數的記憶體位置叫出來。
展示:
```c=
#include<stdio.h>
int main(){
int a=10;
printf("%p\n",&a);
printf("%d",a);
return 0;
}
```
輸出
```
0061FF1C
10
```
這個0061FF1C就是a所配置到的記憶體位置
這會再指標的單元再講一次,反正現在要記得scanf的時候變數前要加&
---
:::warning
記得scanf的雙引號裡面不要有**無意義**空白,只要有%?就好,以免出錯。
:::
舉個**有意義**的空白的例子:
看一下程式碼:
```c
#include <stdio.h>
int main(){
int i;
char ch;
scanf("%d",&i);
scanf(" %c",&ch);
printf("i = %d\nch = %c\n", i, ch);
return 0 ;
}
```
輸入
```
10
A
```
輸出
```
i = 10
ch = A
```
**如果%c前沒加空白會怎樣?**
輸出
```
i = 10
ch =
```
當我輸入10之後,程式就直接結束了,連讓我輸A的機會都沒有QAQ,為什麼?
因為其實我們輸入的不只是10,還有一個`\n`,這會牽扯到標準輸入流[^1]和緩衝區[^2],簡單來講就是%c將\n吃掉了,導致輸出了一個空的東西
:::success
所以對於scanf()而言,%c是個較為特殊的符號。%c前如果有空格,scanf()則讀取標準輸入流中第一個非空白(換行)字元
:::
[^2]:緩衝區:是一塊存放臨時輸入資料的記憶體,我們在鍵盤上輸入資料之所以不會馬上顯示,就是因為資料存放在了緩衝區,在上面例子中,當我們按下回車鍵後,緩衝區的資料會傳送到標準輸入流。
[^1]:標準輸入流(stdin)是檔案指標,scanf()就是從標準輸入流獲取資料。
---
### scanf特殊用法1
在scanf的輸入字串中,如果有包含其他字元,在讀入的時候scanf會按照字串裡的字元進行輸入處理,但使用時機是要在輸入是固定的情況下才能使用
```cpp=
int a,b,c;
scanf("(%d,%d,%d)",&a,&b,&c);
printf("%d %d %d",a,b,c);
```
輸入
```
(1,2,3)
```
輸出
```
1 2 3
```
### scanf特殊用法2(%[])
`[]`代表一個集合,可以命令scanf需要讀的內容,`[]`內的字元代表scanf只接受`[]`裡的字元,只要是在`[]`以外的字元讀取就會結束。
加上`^`代表只要讀到`^`後得字元讀取就會結束
```cpp=
char c[100];
scanf("%[asd]",c);
printf("%s",c);
```
輸入
```
asdwdsa
```
輸出
```
asd
```
---
```cpp=
char c[100];
scanf("%[^\n]",c);
printf("%s",c);
```
輸入
```
Hello world
```
輸出
```
Hello world
```
---
## 來寫個練習題
[程式語言的開端(\~ ̄▽ ̄)~ ](https://chiscoj.com/problem/a001)
[How to all pass](https://chiscoj.com/problem/a002)
[購買巧克力](https://chiscoj.com/problem/a003)
---
###### tags: `中和高中`