程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++中string和string.h的作用和區別

C++中string和string.h的作用和區別

編輯:關於C++

#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 類。

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved