C/C++關於string.h標頭檔和string類

來源:互聯網
上載者:User

 學習C語言時,用字串的函數例如stpcpy()、strcat()、strcmp()等,要包含標頭檔string.h
學習C++後,C++有字串的標準類string,string類也有很多方法,用string類時要用到string.h標頭檔。
我現在看vc的書上也有CString類,這個要包含什麼,怎麼用?

我現在很迷惑,這兩個 string.h有什麼區別。是怎麼回事

 

且看一:

這兩個一個是標準C庫的,定義了一些字串的處理函數.一個是標準C++庫的,定義了標準C++的std::string類.
要用這個類要包含標頭檔<string>...如下;
#include <string>
using namespace std;//關於名字空間有興趣自己查去,一般用標準庫這句就行了

當然標準C庫也是標準C++庫的一部分,要用標準C庫裡的處理函數...如下:
#include <string.h>//所以你用這句包含的是標準C庫的標頭檔
...或者用如下C++風格的,它們是等價的,不過比較推薦:
#include <cstring>
using namespace std;

CString類是MFC的類,...不搞Windows MFC編程用不到

 

且看二:

 

 

#include < string .h >

void main()
{
string aaa = " abcsd d " ;
printf( " looking for abc from abcdecd %s/n " ,
(strcmp(aaa, " abc " )) ? " Found " : " Not Found " );

}

  不能正確執行,提示說是string類型沒有定義

  而下面:

#include < string >

using namespace std;
void main()
{
string aaa = " abcsd d " ;
printf( " looking for abc from abcdecd %s/n " ,
(strcmp(aaa, " abc " )) ? " Found " : " Not Found " );
}

  這裡的string編譯器就認識了,但是strcmp就不認識了呢?

  一般一個C++的老的帶“。h”副檔名的庫檔案,比如iostream.h,在新標準後的標準庫中都有一個不帶“。h”副檔名的相對應,區別除了後者的好多改進之外,還有一點就是後者的東東都塞進了“std”名字空間中。

  但唯獨string特別。

  問題在於C++要相容C的標準庫,而C的標準庫裡碰巧也已經有一個名字叫做“string.h”的標頭檔,包含一些常用的C字串處理函數,比如樓主提到的strcmp.

  這個標頭檔跟C++的string類半點鐘關係也沒有,所以<string>並非<string.h>的“升級版本”,他們是毫無關係的兩個標頭檔。

  要達到樓主的目的,比如同時:

#include < string .h >
#include < string >
using namespace std;

或者

 

#include < cstring >
#include < string >

  其中<cstring>是與C標準庫的<string.h>相對應,但裹有std名字空間的版本。

  笑談(來自高品質++)

  C++標準庫很大。非常大。難以置信的大。怎麼個大法?這麼說吧:在C++標準中,關於標準庫的規格說明佔了密密麻麻300 多頁,這還不包括標準C 庫,後者只是"作為參考"(老實說,原文就是用的這個詞)包含在C++庫中。當然,並非總是越大越好,但在現在的情況下,確實越大越好,因為大的庫會包含大量的功能。標準庫中的功能越多,開發自己的應用程式時能藉助的功能就越多。C++庫並非提供了一切(很明顯的是,沒有提供並發和圖形使用者介面的支援),但確實提供了很多。幾乎任何事你都可以求助於它。在歸納標準庫中有些什麼之前,需要介紹一下它是如何組織的。因為標準庫中東西如此之多,你(或象你一樣的其他什麼人)所選擇的類名或函數名就很有可能和標準庫中的某個名字相同。為了避免這種情況所造成的名字衝突,實際上標準庫中的一切都被放在名字空間std 中(參見條款28)。但這帶來了一個新問題。無數現有的C++代碼都依賴於使用了多年的偽標準庫中的功能,例如,聲明在<iostream.h>,<complex.h>,<limits.h>等標頭檔中的功能。現有軟體沒有針對使用名字空間而進行設計,如果用std 來封裝標準庫導致現有代碼不能用,將是一種可恥行為。(這種釜底抽薪的做法會讓現有代碼的程式員說出比"可恥" 更難聽的話)懾於被激怒的程式員會產生的破壞力,標準委員會決定為封裝了std 的那部分標準庫構件建立新的標頭檔名。產生新標頭檔的方法僅僅是將現有C++標頭檔名中的。h 去掉,方法本身不重要,正如最後產生的結果不一致也並不重要一樣。所以<iostream.h>變成了<iostream>,<complex.h>變成了<complex>,等等。對於C 標頭檔,採用同樣的方法,但在每個名字前還要添加一個c.所以C 的<string.h>變成了<cstring>,<stdio.h>變成了<cstdio>,等等。最後一點是,舊的C++標頭檔是官方所反對使用的(即,明確列出不再支援),但舊的C 標頭檔則沒有(以保持對C 的相容性)。實際上,編譯器製造商不會停止對客戶現有軟體提供支援,所以可以預計,舊的C++標頭檔在未來幾年內還是會被支援。

 

  所以,實際來說,下面是C++標頭檔的現狀:

  舊的C++標頭檔名如<iostream.h>將會繼續被支援,儘管它們不在官方標準中。這些標頭檔的內容不在名字空間std 中。

  新的C++標頭檔如<iostream>包含的準系統和對應的舊標頭檔相同,但標頭檔的內容在名字空間std 中。(在標準化的過程中,庫中有些部分的細節被修改了,所以舊標頭檔和新標頭檔中的實體不一定完全對應。)

  標準C 標頭檔如<stdio.h>繼續被支援。標頭檔的內容不在std 中。

  具有C 庫功能的新C++標頭檔具有如<cstdio>這樣的名字。它們提供的內容和相應的舊C 標頭檔相同,只是內容在std 中。

  所有這些初看有點怪,但不難習慣它。最大的挑戰是把字串標頭檔理清楚:

  <string.h>是舊的C 標頭檔,對應的是基於char*的字串處理函數;

  <cstring>是對應於舊C 標頭檔的std 版本;

  <string>是封裝了std 的C++標頭檔,對應的是新的string 類。

  如果能掌握這些(我相信你能),其餘的也就容易了。

 

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.