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


①gets——從標准輸入接收一串字符,遇到'\n'時結束,但不接收'\n',把 '\n'留存輸入緩沖區;把接收的一串字符存儲在形式參數指針指向的空間,並在最后自動添加一個'\0'。
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