C語言中的getchar和putchar詳解
原文地址:
http://www.cnblogs.com/hdchild/archive/2009/11/19/1606457.html
一、首先給出《The_C_Programming_Language》這本書中的例子:
#include <stdio.h>
int main( )
{
int c;
c = getchar();
while (c != EOF)
{
putchar();
c= getchar();
}
return 0;
}
這裡主要解釋下為什麼要用int型來接受getchar函式。
很多時候,我們會寫這樣的兩行程式碼:
char c;
c = getchar();
這樣就很有可能出現問題。因為getchar函式除了返回終端輸入的字元外,在遇到Ctrl+D(Linux下)即檔案結束符EOF時,getchar ()的返回EOF,這個EOF在函式庫裡一般定義為-1。因此,在這種情況下,getchar函式返回一個負值,把一個負值賦給一個char型的變數是不正確的。
二、下面用一個題目來看其實如何獲取字元和輸出字元的。
#include 'stdio.h'
main()
{
char c,d,e,f;
printf('please input two characters:\n');
c=getchar();
putchar(c);
putchar('\n');
d=getchar();
putchar(d);
putchar('\n');
e=getchar();
putchar(e);
putchar('\n');
f=getchar();
putchar(f);
putchar('\n');
printf('c= %c\n',c);
printf('d= %c\n',d);
printf('e= %c\n',e);
printf('f= %c\n',f);
}
執行後先輸入“12”,回車,再輸入“34”,回車。
執行環境是redhat gcc
執行結果:
please input two characters:
12
1
2
34
3
c=1
d=2
e=
f=3
下面具體解釋一下:
getchar函式每次從緩衝區中得到一個字元(包括換行符),putchar函式每次輸出一個字元(包括換行符)。
首先輸入了兩個字元12,然後回車,注意這時寫入快取中的有3個字元1,2,回車。
程式中有四個getchar(),於是c='1',d='2',e='\n'。
這時執行到f=getchar();輸入快取中的三個字元均被前三個getchar獲取,這時需要使用者輸入,
這裡輸入了34
於是f='3',4和後面的回車沒有被利用。
這便是整個流程。
這裡我們要注意下面幾條:
1) 用getchar讀入時,如果不按回車符,所有輸入會放入緩衝區,而不會被讀入,所以執行c=getchar();時,我們輸入12,如果不按Enter鍵,1仍然不會讀入;
2) 最後按下的Enter鍵,雖是用來告訴系統輸入已結束,但同時也會作為一個字元放入緩衝區,所以我們輸入12,按回車後,輸入流其實有三個字元:1、2、回車,而這個回車就被e讀取了;
3) 12是被當做兩個字元1和2(注意,不是數字1、2),而不像%d時,作為一個數字12來看待;
4) putchar()輸出指定字元,不會在輸出後自動換行,所以putchar(c);和putchar(d);之間要加putchar('\n');如果不加的話,會把c和d兩個自動(1、2)輸入到同一行。
5)getchar可以讀入所有字元。
6)windows下如果想結束,就輸入Ctrl+Z,表示EOF
http://www.cnblogs.com/hdchild/archive/2009/11/19/1606457.html
一、首先給出《The_C_Programming_Language》這本書中的例子:
#include <stdio.h>
int main( )
{
int c;
c = getchar();
while (c != EOF)
{
putchar();
c= getchar();
}
return 0;
}
這裡主要解釋下為什麼要用int型來接受getchar函式。
很多時候,我們會寫這樣的兩行程式碼:
char c;
c = getchar();
這樣就很有可能出現問題。因為getchar函式除了返回終端輸入的字元外,在遇到Ctrl+D(Linux下)即檔案結束符EOF時,getchar ()的返回EOF,這個EOF在函式庫裡一般定義為-1。因此,在這種情況下,getchar函式返回一個負值,把一個負值賦給一個char型的變數是不正確的。
二、下面用一個題目來看其實如何獲取字元和輸出字元的。
#include 'stdio.h'
main()
{
char c,d,e,f;
printf('please input two characters:\n');
c=getchar();
putchar(c);
putchar('\n');
d=getchar();
putchar(d);
putchar('\n');
e=getchar();
putchar(e);
putchar('\n');
f=getchar();
putchar(f);
putchar('\n');
printf('c= %c\n',c);
printf('d= %c\n',d);
printf('e= %c\n',e);
printf('f= %c\n',f);
}
執行後先輸入“12”,回車,再輸入“34”,回車。
執行環境是redhat gcc
執行結果:
please input two characters:
12
1
2
34
3
c=1
d=2
e=
f=3
下面具體解釋一下:
getchar函式每次從緩衝區中得到一個字元(包括換行符),putchar函式每次輸出一個字元(包括換行符)。
首先輸入了兩個字元12,然後回車,注意這時寫入快取中的有3個字元1,2,回車。
程式中有四個getchar(),於是c='1',d='2',e='\n'。
這時執行到f=getchar();輸入快取中的三個字元均被前三個getchar獲取,這時需要使用者輸入,
這裡輸入了34
於是f='3',4和後面的回車沒有被利用。
這便是整個流程。
這裡我們要注意下面幾條:
1) 用getchar讀入時,如果不按回車符,所有輸入會放入緩衝區,而不會被讀入,所以執行c=getchar();時,我們輸入12,如果不按Enter鍵,1仍然不會讀入;
2) 最後按下的Enter鍵,雖是用來告訴系統輸入已結束,但同時也會作為一個字元放入緩衝區,所以我們輸入12,按回車後,輸入流其實有三個字元:1、2、回車,而這個回車就被e讀取了;
3) 12是被當做兩個字元1和2(注意,不是數字1、2),而不像%d時,作為一個數字12來看待;
4) putchar()輸出指定字元,不會在輸出後自動換行,所以putchar(c);和putchar(d);之間要加putchar('\n');如果不加的話,會把c和d兩個自動(1、2)輸入到同一行。
5)getchar可以讀入所有字元。
6)windows下如果想結束,就輸入Ctrl+Z,表示EOF
相關文章
- c語言中的getchar()和EOFC語言
- C 語言中的 sscanf 詳解
- c語言中sizeof詳解C語言
- C語言中的#和##C語言
- C語言中static關鍵字詳解C語言
- C 語言中 void* 詳解及應用介紹
- 【Golang詳解】go語言中併發安全和鎖Golang
- 詳細解讀go語言中的chnanelGoNaN
- C語言中“陣列名”和“&陣列名”C語言陣列
- C語言中編譯和連結C語言編譯
- C語言中的置0和置1操作C語言
- C/C++語言精髓 *和&詳解C++
- 解析C語言中的sizeofC語言
- C語言中extern的用法C語言
- c語言中的作用域C語言
- 【C】 30_C語言中的字串C語言字串
- C語言中pi=&j和*pi=j的區別C語言
- c語言中作用域和儲存期的區別C語言
- C 語言中的 time 函式函式
- static在C語言中的作用C語言
- 詳解 Go 語言中 20 個佔位符!Go
- 你正真瞭解C語言中的指標嗎C語言指標
- C語言中函式printf()和函式scanf()的用法C語言函式
- c語言中文和ascii碼字元分離C語言ASCII字元
- C語言——常用標準輸入輸出函式 scanf(), printf(), gets(), puts(), getchar(), putchar(); 字串拷貝函式 strcpy(), strncpy(), strchr(), strstr()函式用法特點C語言函式字串
- C語言中qsort函式的用法C語言函式
- C 語言中 static 的作用介紹
- C語言中的資料型別C語言資料型別
- C語言中幾種報錯型別的解決方案C語言型別
- C語言中continue的理解(fishing_1)C語言
- C語言中volatile關鍵字的作用C語言
- C語言中函式的返回值C語言函式
- 淺談C語言中函式的使用C語言函式
- 解決vscode c語言中scanf函式的輸入問題VSCodeC語言函式
- C語言中結構體感悟C語言結構體
- c語言中const修飾符C語言
- c語言中%f輸出double型和float型值C語言
- c語言中自動儲存期和靜態儲存期C語言
- C語言 printf詳解C語言