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

數組

gets——從標準輸入接收一串字符,遇到'\n'時結束,但不接收'\n',把 '\n'留存輸入緩衝區;把接收的一串字符存儲在形式參數指針指向的空間,並在最後自動添加一個'\0'。
getchar——從標準輸入接收一個字符返回,多餘的字符所有留在輸入緩衝區。
fgets——從文件或標準輸入接收一串字符,遇到'\n'時結束,把'\n'也做爲一個字符接收;把接收的一串字符存儲在形式參數指針指向的空間,並在'\n'後再自動添加一個'\0'。

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

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

gets能夠接收空格spa

scanf遇到空格、回車和Tab鍵都會認爲輸入結束,全部它不能接收空格3d

 

函數原型 指針

char *fgets(char *buf, int bufsize, FILE *stream); 

fgets用法:code

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

fgets(buf, n, file) 內存

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

 

②一個問答題:

ASK

若是定義了兩個字符數組a[10]  b[10]
而後連續用兩個
fgets(a,11,stdin);
fgets(b,11,stdin);
而後用兩個puts依次打印出兩個字符數組的內容.
若是第一次輸入的時候超過了10個字符(其中沒有按回車鍵).
那麼在第一次回車後會顯示兩個字符串的內容,第一次輸入的多於10個的字符保存到了第二個字符數組中。
請問這是爲何?fgets不是行緩衝輸入嗎?
具體例子以下:

 1 #include"stdio.h"
 2 #include"string.h"
 3 void main()
 4 {
 5     char str1[10];
 6     char str2[10];
 7     fgets(str1,11,stdin);
 8     fgets(str2,11,stdin);
 9     /*fgets的用法,
10     第一個參數爲數組,
11     第二個爲數組的大小,
12     第三個網上stdin是標準輸入(也就是鍵盤輸入),
13     C標準庫裏面的一個全局變量stdin也是FILE*類型的,
14     所以在使用FILE*類型做爲參數的地方,能夠使用stdin*/    
15     printf("%s\n%s\n",str1,str2);
16     printf("%c\n",str2[0]);
17 }

 

輸入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,這樣會溢出的。 你這裏運行沒問題是由於字符數組的數組名做參數時被自動轉換爲字符指針了。

相關文章
相關標籤/搜索