getchar函數運用問題?

#include &
int main(void)
{
int c,num;
for (num = 1; (c = (getchar())) != EOF; num++)
{

if (c ==
|| c == || c == )
{
printf("
");
}
else
putchar(c);
}
printf("the length of the sentense is %d
",num);
return 0;

/*
上述代碼編譯器給過了
但是最後輸出的結果是這個樣子的:

hello world
hello
world

到此為止,並沒有輸出num的值,這是為什麼??

*/
}


你們發代碼能不能用代碼格式化工具發啊,就往那一粘,等誰來給你格式化?

好了說正事

循環退出條件是遇到EOF,怎麼打EOF自己去查


你是怎麼終止程序的?


1. Windows上按Ctrl+Z就可以輸入EOF符號了,linux上要按Ctrl+D;

2. 當然,你也可以使用文本作為輸入,假設你編譯過後的文件叫做hello.exe,輸入放在input.txt里,只需要在命令行里用重定向就可以了:hello.exe &< input.txt,不用輸任何EOF符號,就會有你想要的結果(當然,我覺得,如果你懂得用命令行和重定向的概念,也就不會提這個問題了,所以這一條看看就好了,有興趣可以google);

3. 如果只是想知道答案,那麼看1就夠了,如果想知道為什麼,那麼可以稍微分析一下。按Ctrl+Z或Ctrl+D或者改用文件輸入,為什麼就可以「輸入EOF」了?

有人總結出來了:EOF是什麼? - 阮一峰的網路日誌,下面只是我胡亂的想法,看看就好了:

首先需要明確的,就是,getchar()其實是從當前進程的標準輸入來讀取字元的,所謂標準輸入其實可以簡單看成一個無窮的字元數組,它有一個特殊的下標KEY,指向這個數組有內容的部分的最後一個位置,getchar()做的是這樣一件事:取走KEY所指向的內容作為函數的返回值,並把KEY的值+1(其實就是向後移動一位)。

重定向其實只是把文件的內容作為標準輸入而已,所以都是一樣的,分析標準輸入與getchar的交互即可。

getchar去讀取這個數組,總得有個結束標誌,不然沒完沒了,EOF它的值其實是-1(根據經驗,還沒遇到不是-1的環境),getchar()讀取出錯,就會返回-1(但若是讀取到的值為-1,也是返回-1,而文件里有可能有值為-1的char,所以讀取文件的時候,不能通過返回值來判斷是否讀取完文件,而應該用文件流提供的eof函數或標誌)。Ctrl+D其實是向當前進程發送一個終止輸入的信號,目測getchar內部是有響應這個信號的處理函數的,不過我沒看過源碼,不好猜測。

總結一下,廢話了這麼多,有兩種想法:

1)(直接的想法)按鍵是輸入一個值為EOF的字元;

2)(間接的想法)按鍵只是向進程發送一個signal,庫函數里處理這個signal而使得getchar返回EOF。

以上兩種想法有待看完getchar的源碼才可以驗證到底是哪一種。


第一次碰見eof吧,差一下,刷題要用到很多次的


研究一下什麼是EOF。


Ctrl +D


推薦閱讀:

是否存在f(x)使得存在不可數個a,有af(x)=f(ax)成立並且存在a有af(x)≠f(ax)?
有哪些長得像餘弦函數的常見函數?
如何理解隱函數的定義?
怎麼用ε-δ語言來描述,當x→x0時,f(x)的極限≠A ?

TAG:C編程語言 | 函數 | C語言入門 | C語言函數 |