①getsc++
【1】函數:gets(字符指針)程序員
【2】頭文件:stdio.h(c中),c++不需包含此頭文件數組
【3】原型:char*gets(char*buffer);函數
【4】功能:從stdin流中讀取字符串,直至接受到換行符或EOF時中止,並將讀取的結果存放在buffer指針所指向的字符數組中。換行符不做爲讀取串的內容,讀取(接受)的換行符被轉換爲null值,並由此來結束字符串。spa
【5】返回值:讀入成功,返回與參數buffer相同的指針;讀入過程當中遇到EOF(End-of-File)或發生錯誤,返回NULL指針。因此在遇到返回值爲NULL的狀況,要用ferror或feof函數檢查是發生錯誤仍是遇到EOF。指針
【6】注意:本函數能夠無限讀取,不會判斷上限,因此程序員應該確保buffer的空間足夠大,以便在執行讀操做時不發生溢出。若是溢出,多出來的字符將被寫入到堆棧中,這就覆蓋了堆棧原先的內容,破壞一個或多個不相關變量的值,爲了不這種狀況,咱們能夠用fgets()來替換gets()。這個事實致使gets函數只適用於玩具程序。在V7的手冊(1979年)中說明:爲了向後兼容,gets刪除換行符,gets並不將換行符存入緩衝區。
和scanf("%s:",&s)的比較htm
1.不一樣點:內存
scanf不能接受空格、製表符Tab、回車等;字符串
而gets可以接受空格、製表符Tab和回車等;get
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,這樣會溢出的。 你這裏運行沒問題是由於字符數組的數組名做參數時被自動轉換爲字符指針了。