1. 程式人生 > 其它 >C語言中getchar()的使用

C語言中getchar()的使用

技術標籤:程式設計c語言

C語言中getchar的使用

參考程式

內容參考Dennis M.Rithchie編寫的《C程式設計語言 第二版》
在這裡插入圖片描述

檔案複製

#include<stdio.h>
/*將輸入複製到輸出*/
int main()
{
  int ch;
  while((c=getchar())!=EOF)
    putchar(ch);
}

int c: char型別專門用於儲存字元型資料,當然任何整型(int)也可用於儲存字元型資料。這裡之所以不把c宣告成char型別,是因為它必須足夠大,除了能儲存任何可能的字元外還要能儲存檔案結束符EOF

EOF:檔案結束符,Windows下為組合鍵Ctrl+Z, Unix/Linux下為組合鍵Ctrl+D。

從執行結果上看,getchar()並不是你每按一次鍵就執行一次,而是在鍵入回車鍵後整體執行的結果。

博主可樂’給出了這種現象的解釋:鍵盤輸入的字元都存到緩衝區內,一旦鍵入回車,getchar()就進入緩衝區讀取字元,一次只返回第一個字元作為getchar函式的值,如果有迴圈或足夠多的getchar語句,就會依次讀出緩衝區內的所有字元直到’\n’。

整個過程為
1.abcdefg 鍵入進入緩衝區
2.abcdefg+enter 鍵入回車 getchar()進入緩衝區讀取字元
3.getchar()每讀取緩衝區一個字元,while判斷為真,putchar()輸出輸出該字元,回車也被讀取輸出。

單詞計數

#include<stdio.h>
#define IN 1   /*在單詞內*/
#define OUT 0   /*在單詞外*/
int main()
{
  int ch,nw,nl,nc,state;
  state=OUT;
  while((ch=getchar())!=EOF){
    ++nc;
    if(ch=='\n')
      ++nl;
    if(ch==' '||ch=='\n'||ch=='\t')
      state=OUT;
    if(state==OUT){
      state=IN;
      ++nw;
    }
} printf("%d %d %d\n",nl,nw,nc); }

讀取字元陣列設計getline()

#include<stdio.h>
/*按行讀取字元陣列,最後兩位留為回車和空*/
#define MAXLINE 4   /*允許的輸入行的最大長度*/
int main()
{
  int ch,i;
  for(i=0;i<MALINE-1 && (ch=getchar())!=EOF && ch!='\n';++i)
    s[i]=ch;
  if(ch='\n'){
    s[i]=ch;
    ++i;
  }
  s[i]='\0';
  printf('%s %d',s,i);
}

設定字元陣列最大長度為4

輸入為ab+回車
在這裡插入圖片描述
1.ab鍵入緩衝區
2.ab+enter 鍵入回車,getchar()進入緩衝區讀取字元,for迴圈開始執行ch=getchar()
3.getchar()讀取 b後 i=2
4.getchar()讀取回車ch=’\n’,i=2,跳出迴圈
5.if(ch==’\n’)條件成立 s[2]=ch=’\n’ i=3
6.s[3]=’\0’
7.最終結果 s=[a b ‘\n’ ‘\0’]
列印時 a b+回車(轉至次行)空+3(i)

輸入為abcdef+回車
在這裡插入圖片描述
1.abcdef鍵入緩衝區
2.abcedf+enter 鍵入回車 for迴圈中getchar()進入緩衝區讀取字元,for迴圈開始執行ch=getchar()
3.getchar()讀取c至ch後 c的內容被存入s[2] 之後 i=3
4.此時 ch=‘c’不等於’\n’
5.s[3]=’\0’
6.最終結果 s=[a b c ‘\0’]
列印時 a b c 空 3

getline()函式

int getline(char s[], int lim)
{
  int ch,i;
  for(i=0;i<lim-1 && (ch=getchar())!=EOF && ch!='\n';++i) 
    s[i]=ch;  /*回車會被讀入c但是不會存入s[i]*/
  if(ch=='\n'){
    s[i]='\n';
    ++i;
  }
  s[i]='\0';
}

關於Ctrl+Z

這裡引用博主烏託對Ctrl+Z的理解

Ctrl+Z的ASCII碼值

#include<stdio.h>
int main()
{
  int c;
  while((c=getchar())!=EOF)
  printf('%c %d\n',c,c);
}

輸入ab ctrl+z
在這裡插入圖片描述
可見在終端windows系統中ctrl+z的ASCII值為26,鍵入ctrl+z其實輸入的是一個ASCII值為26的字元。

對於單詞計數程式

#include<stdio.h>
#define IN 1   /*在單詞內*/
#define OUT 0   /*在單詞外*/
int main()
{
  int ch,nw,nl,nc,state;
  state=OUT;
  while((ch=getchar())!=EOF){
    ++nc;
    if(ch=='\n')
      ++nl;
    if(ch==' '||ch=='\n'||ch=='\t')
      state=OUT;
    if(state==OUT){
      state=IN;
      ++nw;
    }
   
  }
  printf("%d %d %d\n",nl,nw,nc);
}

Ctrl+Z前沒有其他字元

輸入abcd+回車+(ctrl+z+回車)
在這裡插入圖片描述
而當ctrl+z前面沒有其他字元時,系統此時會檢測到ctrl+z,此時getchar()就會讀取失敗,返回EOF。所以如果需要終端輸入ctrl+z終止輸入,需要另起一行輸入ctrl+z才行。

Ctrl+Z前有其他字元

輸入abcd+(ctrl+z+回車)+回車+(ctrl+z+回車)
在這裡插入圖片描述
ctrl+z前面有其他字元時,此時系統認為緩衝區中有可讀的資料,系統不會檢測ctrl+z(因為有要讀的資料,還不能認為到了流的末尾)

在while迴圈中新增顯示

printf("%c",c);

輸入abcd+(ctrl+z+回車),顯示後+(ctrl+z+回車)
在這裡插入圖片描述
1.對於前面有資料的^z getchar()將其當做ASCII碼為26的字元讀入ch,顯示為‘->’
2.第一個^z後的回車沒有讀入ch中