c語言中gets ,getschar 和fgets 的用法及三者之間的差別,還有scanf


gets

【1】函數:gets(字符指針)

【2】頭文件:stdio.h(c中),c++不需包含此頭文件

【3】原型:char*gets(char*buffer);

【4】功能:從stdin流中讀取字符串,直至接受到換行符或EOF時停止,並將讀取的結果存放在buffer指針所指向的字符數組中。換行符不作為讀取串的內容讀取(接受)的換行符被轉換為null值,並由此來結束字符串

【5】返回值:讀入成功,返回與參數buffer相同的指針;讀入過程中遇到EOF(End-of-File)或發生錯誤,返回NULL指針。所以在遇到返回值為NULL的情況,要用ferrorfeof函數檢查是發生錯誤還是遇到EOF。

【6】注意:本函數可以無限讀取,不會判斷上限,所以程序員應該確保buffer的空間足夠大,以便在執行讀操作時不發生溢出。如果溢出,多出來的字符將被寫入到堆棧中,這就覆蓋了堆棧原先的內容,破壞一個或多個不相關變量的值,為了避免這種情況,我們可以用fgets()來替換gets()。這個事實導致gets函數只適用於玩具程序。在V7的手冊(1979年)中說明:為了向后兼容,gets刪除換行符,gets並不將換行符存入緩沖區。

 

和scanf("%s:",&s)的比較

1.不同點:

  scanf不能接受空格、制表符Tab、回車等

  而gets能夠接受空格、制表符Tab和回車等

2.相同點:

  字符串接受結束后自動加'\0'。

使用scanf("%s",&s);函數輸入字符串時存在一個問題,就是如果輸入了空格會認為字符串結束,對於gets()函數:空格后(包括空格)的字符將作為下一個輸入項處理,但gets()函數將接收輸入的整個字符串直到遇到換行為止

對於scanf();若首個字符為空格,scanf("%s",&s);會從空格后的字符作為首個輸入項;

 


getchar——從標准輸入接收一個字符返回,多余的字符全部留在輸入緩沖區。
fgets——從文件或標准輸入接收一串字符,遇到'\n'時結束,把'\n'也作為一個字符接收;把接收的一串字符存儲在形式參數指針指向的空間,並在'\n'后再自動添加一個'\0'。

簡單說,gets是接收一個不以'\n'結尾的字符串,getchar是接收任何一個字符(包括'\n'),fgets是接收一個以'\n'結尾的字符串。

scanf( )函數和gets( )函數都可用於輸入字符串,但在功能上有區別。

gets可以接收空格

scanf遇到空格、回車和Tab鍵都會認為輸入結束,所有它不能接收空格

 

fgets用法:

fgets(buf,sizeof(s),stdin):

fgets(buf, n, file) 函數功能:從 目標文件流 file 中讀取 n-1 個字符,放入以 buf 起始地址的內存空間中。

樓主的函數調用是這個意思:
首先,s 肯定是一個字符數組。
該調用從 標准輸入流 stdin (也就是鍵盤輸入)讀入 s 數組的大小(sizeof(s))再減 1 的長度的字符到 buf 所指的內存空間中(前提是buf已經申請好空間了)

 

②一個問答題:

ASK

如果定義了兩個字符數組a[10]  b[10]
然后連續用兩個
fgets(a,11,stdin);
fgets(b,11,stdin);
然后用兩個puts依次打印出兩個字符數組的內容.
如果第一次輸入的時候超過了10個字符(其中沒有按回車鍵).
那么在第一次回車后會顯示兩個字符串的內容,第一次輸入的多於10個的字符保存到了第二個字符數組中。
請問這是為什么?fgets不是行緩沖輸入嗎?
具體例子如下:
#include"stdio.h"
#include"string.h"
void main()
{
char str1[10];
char str2[10];
fgets(str1,11,stdin);
fgets(str2,11,stdin);---------------------------------------------fgets的用法,第一個參數為數組,第二個為數組的大小,第三個網上是這么說的//stdin是標准輸入(也就是鍵盤輸入),C標准庫里面的一個全局變量 
stdin也是FILE*類型的,因此在使用FILE*類型作為參數的地方,可以使用stdin//。。。。。。。
printf("%s\n%s\n",str1,str2);
printf("%c\n",str2[0]);
}

輸入asdfasdfasdf123

回車后直接輸出兩組字符串
asdfasdfas
df123

ANSWER

字符串超長,fgets讀了size-1個字符還沒有讀到'\n',就把已經讀到的size-1個字符和一個'\0'字符存入字符數組,剩下的字符可以在下次調用fgets時繼續讀。
輸入asdfasdfasdf123,第一次fgets只取走了前10個字符,余下的df123被下一次fgets取走了。
另外,還有兩點:
1)包含的是系統頭文件,建議用如下形式:
   #include <stdio.h>
   #include <string.h>
2)你這里fgets中size指定為11,而定義字符數組時,大小卻為10,這樣會溢出的。 你這里運行沒問題是因為字符數組的數組名作參數時被自動轉換為字符指針了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM