或許是真的是一直在玩單片機,所以偏向於單片機C語言,今天簡單的gets()都遇到了問題。目的是要從鍵盤讀取幾行,然後輸出最字符數最大的那行,這樣gets()可以勝任,gets在遇到enter即換行符是會停止讀入,但是換行符不最爲讀取串的內容,讀取的換行符被轉換爲NULL,即‘\0’,由此來結束字符串。而getchar與之不同,會讀取換行符(換行符會放在緩衝區)
while(gets(input)!= NULL)
問題出在,假如我讀取了三行之後,不想讀入了呢?該怎麼結束,第三行以enter結束,再接着按一個enter?顯然是不行的,調試發現gets將這個enter轉換爲‘\0’,然後存入數組。然後繼續進入while的條件判斷,執行gets,等待用戶輸入,這不是我想要的結果。
於是自作聰明的在while循環加了個判斷,
//if(!strcmp(input,"-1"))
//break;
人爲地給標誌位。
後來百度,發現在不輸入任何字符之前,按ctrl+z 就可以讓gets返回null。還真是這樣。其實ctrl+z只是告訴gets 沒有鍵入字符,同時給個0給gets函數,這樣gets函數就返回NULL了。
附上
gets的讀取規則:
1.只要gets遇到換行符,即便它是輸入的第一個字符,gets也會停止讀取並返回。如果輸入的第一個字符就爲換行符,那麼字符串將是空串。
2.gets函數讀取換行符並丟棄之,換行符將不會存儲在字符串中。
gets的返回值:
1.正常讀取,沒有遇到文件結尾時,則返回字符串,返回字符串的首地址,char *類型。讀取空串也是正常讀取。與getschar的返回不同。gets是肯定不會返回int類型的 EOF的。
2.遇到文件結尾,返回NULL。
在gets函數沒有遇到任何數據之前遇到文件結尾標誌將返回NULL。比如在運行程序後,什麼也不輸入,只按ctrl+z,gets函數返回了null。