日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C语言基础级——标准输入和输出

發布時間:2024/1/8 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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)。
int n; scanf("%d", &n);

變量有它的基礎數據特性,還有一個是地址(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语言基础级——标准输入和输出的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。