C语言基础级——标准输入和输出
輸入和輸出
轉載請標明出處!
文章目錄
- 輸入和輸出
- 1 標準輸出
- 1.1 格式占位符
- 1.2 輸出方式
- 1.3 頭文件
- 1.4 擴展
- 2. 標準輸入
- 2.1 擴展
- 2.1.1 %d%d
- 2.1.2 %c%c
- 3. 緩沖區
說一下題外話,最近在出差,所以沒什么精力,導致更新進度滯后。也是興致來朝,索性更新一篇。
那本節內容主要講解,C語言的標準輸入與輸出的定義、使用以及內容緩沖區的原理,讓你能夠對C語言的printf和scanf有更加深刻地理解。
1 標準輸出
C語言標準輸出是一個接口庫函數,已經寫好了實現,我們只需要去調用它,就可以實現從終端中打印出信息。標準輸出函數格式:
// [返回值] [函數名]([格式化字符串], [可變參數列表]); int printf(const char* fromat, ...);- 參數:
- fromat 為格式化字符串,包含兩部分。第一部分是正常字符,原樣輸出。第二部分是格式占位符。
- ... 為可變參數列表,可變參數個數與格式占位符數量一致。
- 返回值
- 作用是打印出字符的個數。(包括空白字符)
1.1 格式占位符
| 用于有符號整型 | %d or %i |
| 用于字符 | %c |
| 用于無符號整型 | %u |
| 用于單浮點數 | %f or %F |
| 用于雙精度浮點數 | %lf |
| 用于科學計算法表示浮點數 | %e or %E |
| 用于實數(不顯示無意義0) | %g or %G |
| 用于內存地址 | %p |
| 用于字符串 | %s |
1.2 輸出方式
第一種,無格式占位符。
注:這里的字符 \n 是一個字符,代表著換行,ASCI碼為13。
printf("Hello Home!\n");第二種,一個格式占位符。
int param = 10; printf("param = %d", param);第三種,多個占位符。
int param_a = 100; int param_b = 200; printf("param_a = %d, param_b = %d\n", param_a, param_b);1.3 頭文件
在真正的使用過程中,如果我們只調用 printf 或 scanf 往往還是不夠的,還需要先調用系統的庫文件。
#include <stdio.h>因為在 stdio.h 文件當中包含 printf 和 scanf 兩個函數的聲明,Linux 系統提供給外部的接口函數,用戶可以直接拿來使用。
1.4 擴展
第一種,有 一 個占位符,無可變參數。
printf("hello %s");我們會發現在Linux系統下編譯,并沒有報 error, 而是 warning ,且最后輸出結果除了 Hello boys 以外,后面都是亂碼, 原因是我們并沒有相應加上需要輸出的參數。
第二種,無占位符,由于輸出格式字符串較長,有些人習慣把字符串分為多行。
printf("Hello boys andgirls!");這種方式是錯誤的,固定字符串不能夠直接進行換行,否則在編譯期間將會報錯。那我們怎么解決這個問題呢?是的,要引入換行符(\)。
printf("Hello boys \and \girls!");2. 標準輸入
printf 這個函數大多數人都可以使用好,雖然 printf 和 scanf 兩個函數原型相同,但是 scanf 在用起來,還是有些讓人抓狂的錯誤,那我們先來看下,C語言標準輸入函數格式:
// [返回值] [函數名]([格式化字符串], [可變參數列表]); int scanf(const char *format, ...);- 參數:
- fromat 為格式化字符串,包含兩部分。第一部分是正常字符,原樣輸出。第二部分是格式占位符。
- ... 為可變參數列表,可變參數個數與格式占位符數量一致。
- 返回值
- 成功返回讀入的數據項數。
- 遇到錯誤或遇到 end of line,返回 EOF(按Ctrl+Z)。
變量有它的基礎數據特性,還有一個是地址(address),怎么理解地址?從生活上,可以理解為是”商品盒子“上的數字標簽,如果把這個地址給到你的朋友,他就能通過這個地址來找到對應數字標簽的盒子。”數字標簽“就是地址,”盒子“就是變量,盒子里”物品“是變量存儲的值。
& 就是取 n 變量的地址,那我們為什么要取變量地址呢?因為用戶從終端輸入信息后存放到輸入緩沖區,scanf函數 要通過地址找到變量存儲區域,然后緩沖區里的信息傳送給變量這塊地址。
2.1 擴展
2.1.1 %d%d
scanf函數的使用要嚴格按照規定的格式輸入。例如格式化字符串為 %d+%d ,那么在終端輸入就要加上中間的 +,否則可能得不到你想要的結果。
int n; int m; scanf("%d+%d", &n, &m);如果想要在終端連接輸入兩個元素。
#include<stdio.h>int main() {int n;int m;scanf("%d%d", &n, &m);printf("n = %d\n", n);printf("m = %d\n", m);return 0; }大家仔細可以看到,輸入的是 20 30,中間是有一個空格把兩個元素分開,而 scanf 里是 %d%d 并沒有空格把兩者分隔開,為什么我們可以這么做?這是因為 scanf 在處理輸入時,如果格式占位符不是用于讀入單個字符的 %c, 它就會將空白字符(空格符、制表符和換行符)都視為一次輸入的終止標記。
2.1.2 %c%c
#include<stdio.h>int main() {char n;char m;scanf("%c%c", &n, &m);printf("n = %c\n", n);printf("m = %c\n", m);return 0; }
輸入 a 和 b 之間如果加了空格,空白字符也會被讀入,所以大家一定要注意,不能夠加入空格,如果要加入空格的話,應這么寫輸入:
scanf("%c %c", &n, &m);3. 緩沖區
我們來看下曾經困擾很多人的問題,先看下代碼。
#include <stdio.h>int main() {int n;scanf("%d\n", &n);printf("n = %d\n", n); }如果我們正常輸入一個整型,然后按下回車(\n),輸出結果是:
2\n無論輸入了多少個回車(\n),運行處于阻塞狀態。然后我們再輸入任意的數,看看結果。
發現當我們輸入任意的數時候,再去敲回車(\n),程序繼續執行打印,運行結果結束且最終打印結果是我們第一次輸入的結果,也就是 2 。
這樣的現象,其實是和緩沖區是有關的,怎么去解釋呢?
首先,輸入的是 2\n\n\n\n ,這一串數據是存放在緩沖區內。
然后,我們再輸入 3\n ,這個時候,退出阻塞,輸出 2 ,程序結束,那么緩沖區數據為:
根本上造成這個現象是因為,緩沖區里最先輸入的 2\n 是滿足 scanf 輸入的格式,但是接下來的三個 \n 在它相鄰左邊并沒檢測到有效的字符(它們的左邊一個都是空白字符),導致了程序阻塞,直到 3\n 的出現,最后一個 \n 檢測到它相鄰左邊有一個非空白字符,阻塞就退出了。
那輸出為 2 而不是 3 的原因是,緩沖區是單向的,有點像隊列(先進先出),所以我們會輸出第一個非空白字符,也就是 2 。
總結
以上是生活随笔為你收集整理的C语言基础级——标准输入和输出的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iOS 高德地图(二)(进阶具体使用的细
- 下一篇: 三星pay显示无法连接服务器,三星智付S