# 輸入輸出 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 ``` --- ### 跳脫字元 ![](https://i.imgur.com/uFmjA4e.png) --- ## 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: `中和高中`