對fgets的理解

来源:https://www.cnblogs.com/9527s/archive/2018/07/18/9332903.html
-Advertisement-
Play Games

gets()函數 因為用gets函數輸入數組時,只知道數組開始處,不知道數組有多少個元素,輸入字元過長,會導致緩衝區溢出,多餘字元可能占用未使用的記憶體,也可能擦掉程式中的其他數據,後續用fgets函數代替。 fgets函數 一小段代碼舉例: (1) fgets函數一次讀入10 - 1個字元,如果少於 ...


gets()函數

    因為用gets函數輸入數組時,只知道數組開始處,不知道數組有多少個元素,輸入字元過長,會導致緩衝區溢出,多餘字元可能占用未使用的記憶體,也可能擦掉程式中的其他數據,後續用fgets函數代替。

fgets函數

    一小段代碼舉例:

    

1 char words[stlen];
2     fgets(words,10,stdin);
3      fputs (words,stdout);
4     puts(words);

 

    (1)  fgets函數一次讀入10 - 1個字元,如果少於這個字元數數按下回車

    例如輸入apple pie 則會將apple pie\n\0儲存在數組中

    隨後的fputs列印時不添加\n

    而puts列印會添加\n,結果會空一行

    (2) 一次讀入超過10 - 1個字元則會在讀取apple pie後加\0儲存在數組中

      列印時因為沒有\n    函數fputs之後沒有換行,緊接著puts列印

 

    fgets()函數讀到文件結尾會返回一個空指針,代碼可用0代替,或者用NULL  //因為暫時不常見在此不做介紹

 

    在11.8中

# include<stdio.h>
# define stlen 10
int main(void)
{
    char words[stlen];
    while(fgets(words,stlen,stdin) != NULL&&words[0] != '\n')//不斷迴圈把stlen-1字元放在數組中加\0,直到最後結尾為\n\0,
       fputs(words,stdout);
    puts("done.");



    return 0;
}

    輸入字元長度超過 10-1 時仍會全部列印,因為輸入緩衝區的原因,輸入aaaaaaaaabbbbbbbbbccccccccc,字元串會在緩衝區暫時保存,第一次while會將aaaaaaaaa輸出但沒有換行,

第二次時bbbbbbbbb,最後的c結束時會將ccccccccc\n\0儲存列印時會換行。

    儲存換行符有好處也有壞處,想去除換行符,可以在已知的字元串中查找換行符,

     while (words[i] != '\n')

      i++;

   word[i] = '\0';

    如果仍有字元串留在輸入行就用

      

while(getchar() != '\n')//讀取但不儲存輸入,包括\n
    continue;

    這樣可以清除緩衝區,超過設定長度會將後面的清除,只列印設定長度字元串。

 1 # include<stdio.h>
 2 # define stlen 10
 3 int main(void)
 4 {
 5     char words[stlen];
 6     int i;
 7     while(fgets(words,stlen,stdin) != NULL&&words[0] != '\n')
 8     {
 9         i = 0;
10         while(words[i] != '\n'&&words[i] != '\0')
11             i++;
12         if(words[i] == '\n')
13             words[i] == '\0';
14         else             //也就是words[0] == '\0'時
15             while(getchar() != '\n')
16             continue;
17 
18         puts(words);
19 
20     }
21     return 0;
22 }

 

    上述代碼,若輸入apple   則輸出apple

      若輸入aaaaaaaaabbbbbbb  則輸出aaaaaaaaa  因為在輸入後緩衝區是aaaaaaaaabbbbbbb,讀取規定字元數將aaaaaaaaa\0放在words中,後續代碼檢測到\0

     因為getchar()緩衝區的字元b依次被讀取並被丟棄,知道讀取到換行符\n,輸出words     //  \n 也被丟棄。

      


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 引言 上一篇文章聊到了Java記憶體模型,在其中我們說JMM是建立在happens before(先行發生)原則之上的。 為什麼這麼說呢?因為在Java程式的執行過程中,編譯器和處理器對我們所寫的代碼進行了一系列的優化來提高程式的執行效率。這其中就包括對指令的“重排序”。 重排序導致了我們代碼並不會按 ...
  • goroutine只是由官方實現的超級"線程池"而已,每個實例4 5kb的棧記憶體占用和用於實現機制而大幅減少的創建和銷毀開銷。 併發不是並行(多CPU): 併發主要由切換時間片來實現"同時"運行,並行則是直接利用多核實現多線程的運行,但Go可以設置使用核數,以發揮多核電腦的能力。 通過go關鍵字實 ...
  • MIPS架構下的MCU,指令集包含R-Type、I-Type、J-Type三種,在數電課程設計時為了給MCU編寫指令集,需要將彙編語言轉化成機器代碼,這裡分享一下自己寫的Matlab 的 GUI。 主函數 C2M 函數rig_f 用來尋找名稱對應的寄存器地址 函數rig_n 用來將5位十進位數轉換成 ...
  • 原創 The Suspects Time Limit: 1000MS Memory Limit: 20000K Total Submissions: 48698 Accepted: 23286 Description Severe acute respiratory syndrome (SARS), ...
  • 1. 學習計劃 第二天:商品列表功能實現 1、服務中間件dubbo 2、工程改造為基於soa架構 3、商品列表查詢功能實現。 2. 將工程改造為SOA架構 2.1. 分析 由於宜立方商城是基於soa的架構,表現層和服務層是不同的工程。所以要實現商品列表查詢需要兩個系統之間進行通信。 如何實現遠程通信 ...
  • provider pom 連接註冊器register需要applicationContext需要web.xml載入配置文件監聽器 註冊 介面 實現類 註意這個@Service是dubbo的Service 右擊maven項目run as選maven build.. 輸入tomcat7:run 啟動這個 ...
  • w2 16、第二周-第02章節-Python3.5-模塊初識 sys模塊 sys.path sys.argv os模塊 os.system os.popen os.mkdir 17、第二周-第03章節-Python3.5-模塊初識2 18、第二周-第04章節-Python3.5-pyc是什麼 19、 ...
  • http://www.cnblogs.com/baixl/p/4170599.html ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...