1. 程式人生 > 其它 >C語言輸入字元和字串

C語言輸入字元和字串

C語言有多個函式可以從鍵盤獲得使用者輸入,它們分別是:

  • scanf():和 printf() 類似,scanf() 可以輸入多種型別的資料。
  • getchar()、getche()、getch():這三個函式都用於輸入單個字元。
  • gets():獲取一行資料,並作為字串處理。

scanf() 是最靈活、最複雜、最常用的輸入函式,上節我們已經進行了講解,本節接著講解剩下的函式,也就是字元輸入函式和字串輸入函式。

輸入單個字元

輸入單個字元當然可以使用 scanf() 這個通用的輸入函式,對應的格式控制符為%c,上節已經講到了。本節我們重點講解的是 getchar()、getche() 和 getch() 這三個專用的字元輸入函式,它們具有某些 scanf() 沒有的特性,是 scanf() 不能代替的。

1) getchar()

最容易理解的字元輸入函式是 getchar(),它就是scanf("%c", c)的替代品,除了更加簡潔,沒有其它優勢了;或者說,getchar() 就是 scanf() 的一個簡化版本。

下面的程式碼演示了 getchar() 的用法:

  • #include <stdio.h>
  • int main()
  • {
  • char c;
  • c = getchar();
  • printf("c: %c\n", c);
  • return 0;
  • }

輸入示例:

@↙
c: @

你也可以將第 4、5 行的語句合併為一個,從而寫作:

char c = getchar();

2) getche()

getche() 就比較有意思了,它沒有緩衝區,輸入一個字元後會立即讀取,不用等待使用者按下回車鍵,這是它和 scanf()、getchar() 的最大區別。請看下面的程式碼:

  • #include <stdio.h>
  • #include <conio.h>
  • int main()
  • {
  • char c = getche();
  • printf("c: %c\n", c);
  • return 0;
  • }

輸入示例:

@c: @

輸入@後,getche() 立即讀取完畢,接著繼續執行 printf() 將字元輸出,所以沒有按下回車鍵程式就執行結束了。

注意,getche() 位於 conio.h 標頭檔案中,而這個標頭檔案是 Windows 特有的,Linux 和 Mac OS 下沒有包含該標頭檔案。換句話說,getche() 並不是標準函式,預設只能在 Windows 下使用,不能在 Linux 和 Mac OS 下使用。

3) getch()

getch() 也沒有緩衝區,輸入一個字元後會立即讀取,不用按下回車鍵,這一點和 getche() 相同。getch() 的特別之處是它沒有回顯,看不到輸入的字元。所謂回顯,就是在控制檯上顯示出使用者輸入的字元;沒有回顯,就不會顯示使用者輸入的字元,就好像根本沒有輸入一樣。

回顯在大部分情況下是有必要的,它能夠與使用者及時互動,讓使用者清楚地看到自己輸入的內容。但在某些特殊情況下,我們卻不希望有回顯,例如輸入密碼,有回顯是非常危險的,容易被偷窺。

getch() 使用舉例:

#include <stdio.h>
#include <conio.h>
int main()
{
    char c = getch();
    printf("c: %c\n", c);
    return 0;
}

輸入@後,getch() 會立即讀取完畢,接著繼續執行 printf() 將字元輸出。但是由於 getch() 沒有回顯,看不到輸入的@字元,所以控制檯上最終顯示的內容為c: @

注意,和 getche() 一樣,getch() 也位於 conio.h 標頭檔案中,也不是標準函式,預設只能在 Windows 下使用,不能在 Linux 和 Mac OS 下使用。

對三個函式的總結

函式 緩衝區 標頭檔案 回顯 適用平臺
getchar() stdio.h Windows、Linux、Mac OS 等所有平臺
getche() conio.h Windows
getch() conio.h Windows

關於緩衝區,我們將在下節《C語言緩衝區(快取)詳解》中展開講解。

輸入字串

輸入字串當然可以使用 scanf() 這個通用的輸入函式,對應的格式控制符為%s,上節已經講到了;本節我們重點講解的是 gets() 這個專用的字串輸入函式,它擁有一個 scanf() 不具備的特性。

gets() 的使用也很簡單,請看下面的程式碼:

  • #include <stdio.h>
  • int main()
  • {
  • char author[30], lang[30], url[30];
  • gets(author);
  • printf("author: %s\n", author);
  • gets(lang);
  • printf("lang: %s\n", lang);
  • gets(url);
  • printf("url: %s\n", url);
  • return 0;
  • }

執行結果:

DaHuaXiYou C-Language↙
author:YanChangSheng
lang: C-Language
http://www.cdsy.xyz http://cdsy.xyz↙
url: http://www.cdsy.xyz

gets() 是有緩衝區的,每次按下回車鍵,就代表當前輸入結束了,gets() 開始從緩衝區中讀取內容,這一點和 scanf() 是一樣的。gets() 和 scanf() 的主要區別是:

  • scanf() 讀取字串時以空格為分隔,遇到空格就認為當前字串結束了,所以無法讀取含有空格的字串。
  • gets() 認為空格也是字串的一部分,只有遇到回車鍵時才認為字串輸入結束,所以,不管輸入了多少個空格,只要不按下回車鍵,對 gets() 來說就是一個完整的字串。

也就是說,gets() 能讀取含有空格的字串,而 scanf() 不能。

總結

C語言中常用的從控制檯讀取資料的函式有五個,它們分別是 scanf()、getchar()、getche()、getch() 和 gets()。其中 scanf()、getchar()、gets() 是標準函式,適用於所有平臺;getche() 和 getch() 不是標準函式,只能用於 Windows。

scanf() 是通用的輸入函式,它可以讀取多種型別的資料。

getchar()、getche() 和 getch() 是專用的字元輸入函式,它們在緩衝區和回顯方面與 scanf() 有著不同的特性,是 scanf() 不能替代的。

gets() 是專用的字串輸入函式,與 scanf() 相比,gets() 的主要優勢是可以讀取含有空格的字串。

scanf() 可以一次性讀取多份型別相同或者不同的資料,getchar()、getche()、getch() 和 gets() 每次只能讀取一份特定型別的資料,不能一次性讀取多份資料。