各位看官們,大家好,上一回中咱們說的是字符和字符串輸入函數的例子,這一回咱們繼續說該例子。閒話休提,言歸正轉。讓我們一起talk C栗子吧!
看官們,我們在上一回中介紹了字符和字符串輸入函數的用法,満篇的理論,不少看官聽著聽著就睡著了。這一回中我們要把理論應用於實踐中,讓我們一起動手去實踐吧。
接下來,我們將通過具體的代碼來說明如何使用字符輸入函數,以及使用時的注意事項:
int main() { char ch; int count = 0; puts("please input a charactor"); while( EOF != ( ch = fgetc(stdin)) ) { printf("input is %c \n",ch); if( ++count > 5 ) break; } printf("count is %d \n",count); return 0; }
從上面 的代碼中可以看到我們通過fgetc函數從流中獲取字符,不過這個流比較特殊,它是我們經常使用的標准輸入流。為了驗證我們是否從流中獲取到了字符,我們輸出了從流中獲取的字符。
編譯並且運行該程序,可以得到以下的運行結果,請大家參考:
please input a charactor a //輸入a然後按下回車鍵 input is a input is b //輸入b然後按下回車鍵 input is b input is c //輸入c然後按下回車鍵 input is c input is count is 6
結合上面的源代碼和程序運行結果,我們可以看到,程序中不停地使用fgetc函數從標准輸入中獲取字符,直到獲取六個字符後才停止。可是我們運行時只輸入了a,b,c三個字符,然後程序就停止運行了,這是為什麼呢?
因為fgetc函數讀取字符後還讀取了回車符,它一共讀取了三個回車符,再加上我們輸入的三個字符,正好是六個字符。大家現在明白其中的原因了吧,另外兩個字符輸入函數:getc和getchar也有同樣的操作,我們就不舉例子了,請大家自己動手去驗證一下,它們是不是和fgetc有同樣的結果。
介紹完字符輸入函數後,我們將通過具體的代碼來說明如何使用字符串輸入函數,以及使用時的注意事項:
int main() { char buf[BUFSIZ] = {'\0',}; char *p = NULL; puts("please input some charactors"); if(NULL != gets(buf) ) puts(buf); p = buf; while(*p != '\0') putchar(*p++); putchar('\n'); puts("please input some charactors"); if(NULL != fgets(buf,BUFSIZ,stdin) ) puts(buf); p = buf; while(*p != '\0') putchar(*p++); return 0; }
從上面 的代碼中可以看到我們通過fgets函數從流中獲取字符串,不過這個流比較特殊,它是我們經常使用的標准輸入流。在這個時候,它和gets函數具有相同的功能。為了驗證我們是否從流中獲取到了字符串,我們輸出了從流中獲取的字符串。
編譯並且運行該程序,可以得到以下的運行結果,請大家參考:
please input some charactors a b //輸入a空格b,然後按下回車鍵 a b //這是puts函數輸出的結果,該函數自動輸出換行符 a b //這是通過while循環中putchar函數輸出的結果,換行符是循環後面的單獨輸出的 please input some charactors a b //輸入a空格b,然後按下回車鍵 a b //這是puts函數輸出的結果,這裡的換行是字符串中自帶的換行符 //這裡的換行是puts函數自動輸出的換行符 a b //這是通過while循環中putchar函數輸出的結果,換行符也是循環中輸出的
結合上面的代碼,我們可以看到,使用標准輸入流的fgets函數和gets函數具有相同的功能,不同之處在於gets沒有把換行符讀取到字符串中,而fgets函數則把換行符讀取到了字符串中。
此外,我們沒有演示函數gets的緩沖區溢出功能,我們使用了標准庫提供的BUFSIZ宏,該值比較大,簡單的字符串不會引起緩沖區溢出,大家可以調整buf的大小,然後輸入比buf容量大的字符串,這時會發生緩沖區溢出。
看官們,我把例子中的代碼整理到了一個文件中,並且把該文件放到了我的資源中,大家可以下載使用。
各位看官,關於字符和字符串輸入函數的例子咱們就說到這裡。欲知後面還有什麼例子,且聽下回分解 。