#include <string.h>
void main() {
string aaa = "abcsd d"; // 錯誤:string 未定義
printf(... strcmp(aaa, "abc") ...); // strcmp 需 char*
}
改用 <string> 卻發現 strcmp 不認識:
#include <string>
using namespace std;
void main() {
string aaa = "abcsd d";
printf(... strcmp(aaa, "abc") ...); // 錯誤:strcmp 找不到
}
| 頭文件 | 屬於 | 內容 | 命名空間 |
|---|---|---|---|
<string.h> | C 標準庫 | C 風格字串函數(strcmp, strcpy 等) | 全域 |
<cstring> | C++ 包裝 C 庫 | 同 string.h | std |
<string> | C++ 標準庫 | std::string 類別 | std |
關鍵點:<string> 不是 <string.h> 的「升級版」,兩者完全無關。C++ 為相容 C 保留了 string.h,並提供 cstring 放入 std;同時引入全新的 string 類別。
#include <cstring> // 或 <string.h>
#include <string>
using namespace std; // 或 std::string, std::strcmp
#include <string>
#include <iostream>
using namespace std;
int main() {
string aaa = "abcsd d";
if (aaa.find("abc") != string::npos)
cout << "Found" << endl;
else
cout << "Not Found" << endl;
return 0;
}
| 類別 | 舊式(C++98 前) | 新式(標準) | 備註 |
|---|---|---|---|
| C++ 庫 | <iostream.h> | <iostream> | 內容在 std,細節可能不同 |
| C 庫 | <stdio.h> | <cstdio> | 內容在 std,舊式仍支援 |
| 字串處理 | <string.h> | <cstring> (C函數) / <string> (C++類) | 三者互不相容 |
C++ 標準庫規格說明佔 300+ 頁,還不含 C 庫。大意味著功能多,開發時能借力越多。所有東西都在
namespace std,避免名稱衝突。舊式頭文件(.h 結尾)被「反對使用」但編譯器仍支援;C 頭文件為相容性保留。最大的挑戰是搞清字串頭文件:string.h(C函數)、cstring(C函數+std)、string(C++類+std)。搞懂這三個,其餘易如反掌。