請問到底該如何輸入,才能使gets回傳NULL呢?
如圖例中:if(ret_val)
uj5u.com熱心網友回復:
windows<enter> <ctrl+z> <enter>
linux
<ctrl+d>
uj5u.com熱心網友回復:
fgets() returns s on success, and NULL on error or when end of file occurs while no characters have been read.輸入EOF就可以回傳NULL,輸入EOF的方式請詳見樓上的回復!
uj5u.com熱心網友回復:
供參考://百度百科對fgets函式的解釋
//fgtes函式原型是:char *fgets(char *buf, int bufsize, FILE *stream);
//從檔案結構體指標stream中讀取資料,每次讀取一行。讀取的資料保存在buf指向的字符陣列中,
//每次最多讀取bufsize-1個字符(第bufsize個字符賦'\0'),如果檔案中的該行,不足bufsize個字符,
//則讀完該行就結束。如若該行(包括最后一個換行符)的字符數超過bufsize-1,則fgets只回傳一個
//不完整的行,但是,緩沖區總是以NULL字符結尾,對fgets的下一次呼叫會繼續讀該行。函式成功將回傳buf,
//失敗或讀到檔案結尾回傳NULL。因此我們不能直接通過fgets的回傳值來判斷函式是否是出錯而終止的,應該
//借助feof函式或者ferror函式來判斷。
//參考:https://my.oschina.net/u/3979769/blog/2208662
//下面這種用法,是安全的判斷檔案讀取結束或者出錯的好方式,切忌不能使用while(!feof(fp)),
//還有對于fgets的第二個引數是最大能讀取檔案字符的個數,一般最大的長度是1024位元組。
//while(fgets(..., stream)){
/* ... */
//}
//if(ferror(stream)){
/* ... */
//}
//stream:檔案指標,如果讀鍵盤輸入的字串,固定寫為stdin
//(1)如果鍵盤輸入的字符個數少于bufsize-1個,函式會將回車錄走,輸出是將回車列印出來;
//(2)如果鍵盤輸入的字符大于bufsize-1個,函式錄走bufsize-1個字符后,剩下的字符留在資料緩沖區,下次
//直接讀取緩沖區內容,不會等鍵盤輸入而跳過輸入,導致輸入失敗。
//回傳值
//1.成功,則回傳第一個引數buf;
//2.在讀字符時遇到eof,則eof指示器被設定,如果還沒讀入任何字符就遇到這種情況,則buf保持原來的內容,回傳NULL;
//3.如果發生讀入錯誤,error指示器被設定,回傳NULL,buf的值可能被改變。
//如何處理掉換行符?
//遍歷字串,遇到換行符,并將其替換成空字符。遇到空字符,就丟棄輸入行剩余的字符。
//為什么要丟棄過長輸入行中的余下字符?
//輸入行中多出來的字符會被留在緩沖區中,成為下一次讀取陳述句的輸入。
//讀取整行輸入并用空字符代替換行符,或者讀取部分輸入,并丟棄其余部分
char * s_gets(char *st,int n)
{
char *ret_val;
int i=0;
ret_val = fgets(st,n,stdin);
if(ret_val!=NULL)
{
while(st[i]!='\n' && st[i]!='\0')
i++;
if(st[i]=='\n')
st[i]='\0';
else
while(getchar()!='\n')
continue;
}
return ret_val;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/260730.html
標籤:C語言
下一篇:C語言整數浮點數轉換小問題
