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()` 函式來說是一組三個字串。

廣告