上一次的文字把Hello world程式說了一點,今天繼續就習題說道說道。
【1.5 字元輸入/輸出】
K&R的C書裡面說過一段話:
1、標準輸入輸出庫的輸出模型: 無論文本從何處輸入和輸出,其輸入和輸出都是按照字元流處理。
2、文字資料流:文字資料流是由零行或者多行字元構成的字元序列,而每行文字則是由零個字元或者多個字元組成;而不管有沒有字元,行末尾則是一個
分行符號。
標準庫的輸入和輸出函數都按照這個規則處理。
(1)回顯輸入的內容
我的測試代碼,如上所示,測試情況如下所示,
這裡有個問題,如果利用上面的代碼我們如何輸入 EOF 字元呢?
如上面的運行結果是:Ctrl + Z 的運行結果。在Linux中利用 Ctrl + D 類比表示輸入結束。
但是是否是所有的情況下輸入 Ctrl + D 都能跳出迴圈呢?我看未必,在輸入的情況下需要分清楚情況。
【習題1.6】
編寫程式驗證 getchar() != EOF 的值是1還是0.
上面提到過EOF的輸入時有條件的,不同的作業系統具有不同的處理方式:
Linux:
1、在Linux中,如果在一行的最開始輸入:Ctrl + D,則表示輸入EOF字元
2、在Linux中,如果在一行的最後輸入:Ctrl + D ,則表示本行輸入結束,需要再輸入:Ctrl + D 才表示EOF
Windows:
在Windows中,也大體若是,但是輸入的按鍵組合不一樣,
1、在Windows中,如果在一行的最開始輸入:Ctrl + Z ,則表示輸入EOF字元
下面是園子裡的一篇新聞的描述:http://news.cnblogs.com/n/121416/
下面是維基百科的說法:http://zh.wikipedia.org/wiki/EOF
下面是我的測試代碼:
View Code
/*本程式驗證 getchar() != EOF 的值是 1 還是 0*/#include <stdio.h>int main(int argc,char* argv[],char* env[]){ short int chInput; while(1) { if(getchar()!=EOF) { putchar('1'); break; } else putchar('0'); } getch(stdin); return 0;}
【習題1.7】
編寫一個列印EOF值的程式,在Windows下我用VS2008測試的時候,發現EOF的定義是在<stdio.h>標頭檔中定義,如下所示:
這裡 EOF 的定義是 -1 ;
測試代碼是:
/* 本程式列印EOF的值*/#include <stdio.h>int main(int argc,char* argv[],char* env){ printf("EOF = %d",EOF); getc(stdin); return 0;}
【習題1.8】
編寫一個統計空格、定位字元和分行符號的程式。
這裡我們需要知道的是:空格、定位字元和分行符號對應的ASCII碼即可,當然我們可以字元來表示。
/* 本程式用來統計空格、定位字元和分行符號的個數*/#include <stdio.h>int main(int argc,char* argv[]){ unsigned int nSpace, nTab, nNewLine; int chInput; nSpace=0; nTab=0; nNewLine=0; while(EOF != (chInput=getchar())) { switch(chInput) { case '\n': ++nNewLine; break; case '\t': ++nTab; break; case '\x20': ++nSpace; } } printf("Space: %d\n",nSpace); printf("Tab: %d\n",nTab); printf("NewLine: %d",nNewLine); return 0;}
代碼中我沒有用字元 ' ' 來表示空格,而用了 '\x20' 是為了強調空格也是個字元,因為有人可能將‘\0' 和一些非顯示字元不當作字元看待。
【習題1.9】
My Code如下所示:
/* 本程式用來回顯輸入,並將連續的多個空格用一個空格替代 */#include <stdio.h>#define YES 1#define NO 0int main(int argc,char* argv[]){ short int MultiSpace; //如果有一個空格就將MultiSpace設定為1 short int chInput; while(EOF != (chInput=getchar())) { if('\x20' == chInput) { MultiSpace=YES; continue; //如果是空格的話,就繼續讀取下一個字元 } else { if(YES==MultiSpace) { putchar('\x20'); MultiSpace=NO; } putchar(chInput); } } return 0;}
暫時就這些內容了。