strings.h 與 string.h 頭文件的區別

来源:https://www.cnblogs.com/xuyaowen/archive/2018/04/24/strings_h_and_string_h.html
-Advertisement-
Play Games

今天使用 man string 來查看 string 文件的使用的方法(畢竟裡面的函數名字和傳入參數和發揮參數的類型,如果一段時間不使用,會產生遺忘。) 偶然發現,string.h 的man page 中 出現了 strings.h 的說明。這引起的我的好奇,很奇怪這個strings 和 strin ...


今天使用 man string 來查看 string 文件的使用的方法(畢竟裡面的函數名字和傳入參數和發揮參數的類型,如果一段時間不使用,會產生遺忘。)

偶然發現,string.h 的man page 中 出現了 strings.h 的說明。這引起的我的好奇,很奇怪這個strings 和 string 之間的關係。我上網搜了幾個帖子,他們寫的不夠清楚,今天我進行重新整理一下吧:

首先我們看一下man string 裡面的內容:

可見,strings 頭文件中包含了部分函數,沒有在 string.h 中出現的。上圖的環境是 macOS Sierra 版本號為:10.12.6

包括; index, rindex, strcasecmp, strncasecmp 這四個函數。

為了一探這個頭文件是不是只有macos 這種 Unix-like 系統中才出現。我在Linux下的ubuntu 系統中也進行了查看。

我們使用命令: man string 命令,同樣可見相同的內容。可見它已經是c 標準庫中的頭文件。

進階:我們到底該用哪個頭文件呢?

為了進一步搞清楚,我們到底在編程的使用string 還是 strings 頭文件。我們在 linux 的 /usr/include 文件夾中打開strings 頭文件來一窺究竟。

在 strings.h 文件中給了我們明確的答案:

大意為: 如果我們使用了string.h 這個頭文件,那麼我們不需要在進行包含這個 strings.h 這個文件。除非有一種情況。如果 沒有定義 __USE_MISC這個變數,這個變數將會在 strings.h 頭文件中進行定義。因為 string.h 中沒有進行對這個變數進行定義。具體怎麼定義的,大家可以在/usr/include/strings.h 這個文件中進行詳細查看。

更進一步:

為了進一步查看社區中的這兩個文件的看法,我們在 stackoverflow 中 找到了這個話題的討論。和我們的解釋大同小異:

觀點1:

strings.h comes from the BSD branch in the unix evolution. Its content has been standardized by POSIX, but most of it is marked as legacy and can be easily replaced with other functions

觀點2:

Typically <strings.h> just adds some useful but non-standard additional string functions to the standard header <string.h>. For maximum portability you should only use <string.h> but if you need the functions in <strings.h> more than you need portability then you can use <strings.h>instead of <string.h>.

 具體,這個 strings.h 頭文件到底有沒有被標準化,我們還需要考證。但是根據兩個man page 的表現。我覺得有90% 的可能已經被標準化。因為 mac os 的 man page 中 已經把它歸為 Standard C library. strings 與 string.h 不僅僅 只是多一個 s 的區別。   結束.   歡迎大家留言討論。歡迎轉載,轉載時請註明出處。   參考鏈接: 1. https://blog.csdn.net/xin_yu_xin/article/details/38672137 2. https://stackoverflow.com/questions/4291149/difference-between-string-h-and-strings-h 3. Linux man page 

 


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

-Advertisement-
Play Games
更多相關文章
  • 之前的文章中,分別從APS,排產到規劃引擎敘述了一些理論基礎;並介紹了一些Optaplanner大概的情況;並一步步將Optaplanner的示例運行起來,將示例源碼導進Eclipse分析了一下它的Hello world入門示例,從本篇開始,我們將分步學習它的一些概念及用法。 什麼是Optaplan ...
  • java中的一些概念彙總 什麼是Java虛擬機?為什麼Java被稱作是“平臺無關的編程語言”? Java虛擬機是一個可以執行Java位元組碼的虛擬機進程。Java源文件被編譯成能被Java虛 擬機執行的位元組碼文件。 Java被設計成允許應用程式可以運行在任意的平臺,而不需要程式員為每一個平臺單獨重 寫 ...
  • <! more 關註我 轉載請務必註明原創地址為: "http://www.54tianzhisheng.cn/2018/04/15/springboot2_code/" 項目結構 結構分析: + Spring boot project 核心代碼,代碼量很多(197508 行) + Spring b ...
  • 前言 線程間的通信主要通過共用對欄位的訪問和對象引用欄位的引用,可能會產生兩種錯誤,線程干擾和記憶體一致性錯誤。Java的同步就是防止這些錯誤,但當多個線程訪問同一資源會導致線程執行緩慢,甚至暫停執行。 線程干擾(Thread Interference) 例子 class Counter { priv ...
  • Go語言聖經-介面1.介面類型是對其它類型行為的抽象和概括2.Go語言中介面類型的獨特之處在於它是滿足隱式實現的3.Go語言中還存在著另外一種類型:介面類型。介面類型是一種抽象的類型4.一個類型可以自由的使用另一個滿足相同介面的類型來進行替換被稱作可替換性(LSP里氏替換) 練習 7.1: 使用來自 ...
  • 今天開始自學Python。 找到神聖傳說中的Python官網:https://www.python.org/,安裝了Python3.6.5。 安裝步驟省略。 安裝requests庫: pip install requests 。 等待片刻即可安裝完畢。 打開IDLE: 測試requests庫是否安裝 ...
  • 在學習spring的時候出現瞭如下異常: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resourc ...
  • 說明:做java開發的幾乎都知道jvm這個名詞,但是由於jvm對實際的簡單開發的來說關聯的還是不多,一般工作個一兩年(當然不包括愛學習的及專門做性能優化的什麼的),很少有人能很好的去學習及理解什麼是jvm,以及弄清楚jvm的工作原理,個人認為這塊還是非常有必要去認真瞭解及學習的,特別是剛入門或入門不 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...