
- C程式設計教程
- C語言 - 首頁
- C語言基礎
- C語言 - 概述
- C語言 - 特性
- C語言 - 歷史
- C語言 - 環境搭建
- C語言 - 程式結構
- C語言 - Hello World
- C語言 - 編譯過程
- C語言 - 註釋
- C語言 - 詞法單元
- C語言 - 關鍵字
- C語言 - 識別符號
- C語言 - 使用者輸入
- C語言 - 基本語法
- C語言 - 資料型別
- C語言 - 變數
- C語言 - 整數提升
- C語言 - 型別轉換
- C語言 - 型別強制轉換
- C語言 - 布林值
- C語言中的常量和字面量
- C語言 - 常量
- C語言 - 字面量
- C語言 - 轉義序列
- C語言 - 格式說明符
- C語言中的運算子
- C語言 - 運算子
- C語言 - 算術運算子
- C語言 - 關係運算符
- C語言 - 邏輯運算子
- C語言 - 位運算子
- C語言 - 賦值運算子
- C語言 - 一元運算子
- C語言 - 自增和自減運算子
- C語言 - 三元運算子
- C語言 - sizeof 運算子
- C語言 - 運算子優先順序
- C語言 - 其他運算子
- C語言中的決策語句
- C語言 - 決策語句
- C語言 - if 語句
- C語言 - if...else 語句
- C語言 - 巢狀 if 語句
- C語言 - switch 語句
- C語言 - 巢狀 switch 語句
- C語言中的迴圈
- C語言 - 迴圈
- C語言 - while 迴圈
- C語言 - for 迴圈
- C語言 - do...while 迴圈
- C語言 - 巢狀迴圈
- C語言 - 無限迴圈
- C語言 - break 語句
- C語言 - continue 語句
- C語言 - goto 語句
- C語言中的函式
- C語言 - 函式
- C語言 - 主函式
- C語言 - 按值呼叫函式
- C語言 - 按引用呼叫函式
- C語言 - 巢狀函式
- C語言 - 變參函式
- C語言 - 使用者自定義函式
- C語言 - 回撥函式
- C語言 - return 語句
- C語言 - 遞迴
- C語言中的作用域規則
- C語言 - 作用域規則
- C語言 - 靜態變數
- C語言 - 全域性變數
- C語言中的陣列
- C語言 - 陣列
- C語言 - 陣列的特性
- C語言 - 多維陣列
- C語言 - 向函式傳遞陣列
- C語言 - 從函式返回陣列
- C語言 - 變長陣列
- C語言中的指標
- C語言 - 指標
- C語言 - 指標和陣列
- C語言 - 指標的應用
- C語言 - 指標運算
- C語言 - 指標陣列
- C語言 - 指向指標的指標
- C語言 - 向函式傳遞指標
- C語言 - 從函式返回指標
- C語言 - 函式指標
- C語言 - 指向陣列的指標
- C語言 - 指向結構體的指標
- C語言 - 指標鏈
- C語言 - 指標與陣列的區別
- C語言 - 字元指標和函式
- C語言 - 空指標
- C語言 - void 指標
- C語言 - 懸空指標
- C語言 - 指標解引用
- C語言 - 近指標、遠指標和巨指標
- C語言 - 指標陣列的初始化
- C語言 - 指標與多維陣列的區別
- C語言中的字串
- C語言 - 字串
- C語言 - 字串陣列
- C語言 - 特殊字元
- C語言中的結構體和聯合體
- C語言 - 結構體
- C語言 - 結構體和函式
- C語言 - 結構體陣列
- C語言 - 自引用結構體
- C語言 - 查詢表
- C語言 - 點 (.) 運算子
- C語言 - 列舉 (enum)
- C語言 - 結構體填充和打包
- C語言 - 巢狀結構體
- C語言 - 匿名結構體和聯合體
- C語言 - 聯合體
- C語言 - 位域
- C語言 - typedef
- C語言中的檔案處理
- C語言 - 輸入 & 輸出
- C語言 - 檔案 I/O (檔案處理)
- C語言預處理器
- C語言 - 預處理器
- C語言 - 預處理指令
- C語言 - 預處理器運算子
- C語言 - 宏
- C語言 - 標頭檔案
- C語言中的記憶體管理
- C語言 - 記憶體管理
- C語言 - 記憶體地址
- C語言 - 儲存類別
- 其他主題
- C語言 - 錯誤處理
- C語言 - 可變引數
- C語言 - 命令執行
- C語言 - 數學函式
- C語言 - static 關鍵字
- C語言 - 隨機數生成
- C語言 - 命令列引數
- C程式設計資源
- C語言 - 問答
- C語言 - 快速指南
- C語言 - 速查表
- C語言 - 有用資源
- C語言 - 討論
C語言輸入輸出函式
從使用者讀取輸入並在控制檯顯示(輸出)是每個 C 程式都需要執行的常見任務。C 語言提供包含各種**輸入輸出函式**的庫(標頭檔案)。在本教程中,我們將學習不同型別的格式化和非格式化**輸入輸出函式**。
C語言中的標準檔案
C語言將所有裝置都視為檔案。“顯示器”等裝置的定址方式與“檔案”相同。
程式執行時,以下三個檔案會自動開啟,以便訪問鍵盤和螢幕。
標準檔案 | 檔案 | 裝置 |
---|---|---|
標準輸入 | stdin | 鍵盤 |
標準輸出 | stdout | 螢幕 |
標準錯誤 | stderr | 螢幕 |
為了訪問檔案,C語言使用預定義的FILE結構體型別來引用用於讀寫目的的檔案。閱讀本章以瞭解如何從螢幕讀取值以及如何在螢幕上列印結果。
輸入輸出函式的型別
C語言中,IO函式分為以下幾類:
- 非格式化字元IO函式:getchar() 和 putchar()
- 非格式化字串IO函式:gets() 和 puts()
- 格式化IO函式:scanf() 和 printf()
非格式化I/O函式以位元組流的形式讀取和寫入資料,沒有任何格式,而格式化I/O函式使用預定義的格式,例如“%d”、“%c”或“%s”,從流中讀取和寫入資料。
非格式化字元輸入輸出函式:getchar() 和 putchar()
這兩個函式分別從鍵盤接受單個字元作為輸入,並在輸出終端顯示單個字元。
getchar()函式讀取單個按鍵,無需按Enter鍵。
int getchar(void)
不需要引數。該函式返回一個整數,該整數對應於使用者輸入的字元鍵的ASCII值。
示例1
以下程式將單個按鍵讀入char變數:
#include <stdio.h> int main() { char ch; printf("Enter a character: "); ch = getchar(); puts("You entered: "); putchar(ch); return 0; }
輸出
執行程式碼並檢查其輸出:
Enter a character: W You entered: W
示例2
以下程式演示瞭如何讀取一系列字元,直到使用者按Enter鍵:
#include <stdio.h> int main() { char ch; char word[10]; int i = 0; printf("Enter characters. End with pressing enter: "); while(1) { ch = getchar(); word[i] = ch; if (ch == '\n') break; i++; } printf("\nYou entered the word: %s", word); return 0; }
輸出
執行程式碼並檢查其輸出:
Enter characters. End with pressing enter: Hello You entered the word: Hello
您還可以使用非格式化的putchar()函式來列印單個字元。C庫函式“int putchar(int char)”將引數char指定的字元(無符號char)寫入stdout。
int putchar(int c)
此函式的單個引數是要寫入的字元。您還可以傳遞其ASCII等效整數。此函式返回寫入的字元(作為無符號char強制轉換為int),或在出錯時返回EOF。
示例3
以下示例演示瞭如何使用putchar()函式:
#include <stdio.h> int main() { char ch; for(ch = 'A' ; ch <= 'Z' ; ch++) { putchar(ch); } return(0); }
輸出
執行此程式碼時,將產生以下輸出:
ABCDEFGHIJKLMNOPQRSTUVWXYZ
格式化字串輸入輸出函式:gets()、fgets()、puts()和fputs()
char *gets(char *str)函式從stdin讀取一行到str指向的緩衝區,直到遇到終止換行符或EOF(檔案結束)。
char *gets (char *str)
此函式只有一個引數。它是指向字元陣列的指標,其中儲存著C字串。函式在成功時返回“str”,在出錯或讀取字元之前發生EOF時返回NULL。
示例
檢視以下示例:
#include <stdio.h> int main() { char name[20]; printf("Enter your name: "); gets(name); printf("You entered the name: %s", name); return 0; }
輸出
Enter your name: Ravikant Soni You entered the name: Ravikant Soni
scanf("%s")讀取字元,直到遇到空格(空格、製表符、換行符等)或EOF。因此,如果您嘗試輸入包含多個單詞(以空格分隔)的字串,則它將接受第一個空格之前的字元作為字串的輸入。
fgets()函式
在較新的C版本中,gets()已被棄用,因為它可能是一個危險的函式,因為它不執行邊界檢查,並且可能導致緩衝區溢位。
建議改用fgets()函式:
fgets(char arr[], size, stream);
fgets()可用於從任何輸入流(如stdin(鍵盤)或FILE(檔案流))接受輸入。
示例1
以下程式演示瞭如何使用fgets()從使用者處接受多單詞輸入:
#include <stdio.h> int main () { char name[20]; printf("Enter a name: \n"); fgets(name, sizeof(name), stdin); printf("You entered: \n"); printf("%s", name); return 0; }
輸出
執行程式碼並檢查其輸出:
Enter a name: Rakesh Sharma You entered: Rakesh Sharma
函式“int puts (const char *str)”將字串's'和尾隨換行符寫入stdout。
int puts(const char *str)
str引數是要寫入的C字串。如果成功,它將返回一個非負值。出錯時,函式返回EOF。
我們可以使用帶有%s說明符的printf()函式來列印字串。我們還可以使用puts()函式(在C11和C17版本中已棄用)或fputs()函式作為替代。
示例2
以下示例顯示了puts()和fputs()之間的區別:
#include <stdio.h> int main () { char name[20] = "Rakesh Sharma"; printf("With puts(): \n"); puts(name); printf("\nWith fputs(): \n"); fputs(name, stdout); return 0; }
輸出
執行程式碼並檢查其輸出:
With puts(): Rakesh Sharma With fputs(): Rakesh Sharma
格式化輸入輸出函式:scanf() 和 printf()
scanf()函式從標準輸入流stdin讀取輸入,並根據提供的格式掃描該輸入:
int scanf(const char *format, ...)
printf()函式將輸出寫入標準輸出流stdout,並根據提供的格式生成輸出。
int printf(const char *format, ...)
格式可以是簡單的常量字串,但您可以指定%s、%d、%c、%f等來分別列印或讀取字串、整數、字元或浮點數。還有許多其他可用的格式選項,可以根據具體要求使用。
C語言中的格式說明符
CPU 以流式方式執行與輸入輸出裝置的IO操作。透過標準輸入流從標準輸入裝置(鍵盤)讀取的資料稱為stdin。類似地,透過標準輸出裝置傳送到標準輸出(計算機顯示螢幕)的資料稱為stdout。
計算機以文字形式接收來自流的資料,但是您可能希望將其解析為不同資料型別的變數,例如int、float或字串。類似地,儲存在int、float或char變數中的資料必須以文字格式傳送到輸出流。格式說明符符號正是為此目的而使用的。
ANSI C 定義了許多格式說明符。下表列出了不同的說明符及其用途。
格式說明符 | 型別 |
---|---|
%c | 字元 |
%d | 帶符號整數 |
%e 或 %E | 浮點數的科學計數法 |
%f | 浮點值 |
%g 或 %G | 類似於 %e 或 %E |
%hi | 帶符號短整數 |
%hu | 無符號短整數 |
%i | 帶符號整數 |
%l 或 %ld 或 %li | 長整數 |
%lf | 雙精度浮點數 |
%Lf | 長雙精度浮點數 |
%lu | 無符號整數或無符號長整數 |
%lli 或 %lld | 長長整數 |
%llu | 無符號長長整數 |
%o | 八進位制表示 |
%p | 指標 |
%s | 字串 |
%u | 無符號整數 |
%x 或 %X | 十六進位制表示 |
減號 (−) 表示左對齊。百分號 (%) 後面的數字指定最小欄位寬度。如果字串小於寬度,則將用空格填充。句點 (.) 用於分隔欄位寬度和精度。
示例
以下示例演示了格式說明符的重要性:
#include <stdio.h> int main(){ char str[100]; printf("Enter a value: "); gets(str); printf("\nYou entered: "); puts(str); return 0; }
輸出
當編譯並執行上述程式碼時,它會等待您輸入一些文字。當您輸入文字並按下 Enter 鍵時,程式繼續並讀取輸入,並顯示如下:
Enter a value: seven 7 You entered: seven 7
這裡需要注意的是,`scanf()` 函式期望輸入的格式與您提供的 “%s” 和 “%d” 相同,這意味著您必須提供有效的輸入,例如“一個字串後跟一個整數”。如果您提供兩個連續的字串“字串 字串”或兩個連續的整數“整數 整數”,則會被認為是錯誤的輸入集。
其次,在讀取字串時,`scanf()` 函式一遇到“空格”就停止讀取,因此字串“This is Test”實際上對於 `scanf()` 函式來說是一組三個字串。