C++ 將字符串值賦給CHAR數(shù)組的實現(xiàn)
我就廢話不多說啦,大家還是直接看代碼吧~
CHAR name[50]; strcpy(name, "tagname");
補(bǔ)充:將char* 賦值給std::string的一些陷阱
這段時間,總是要使用char或者char* 賦值給std::string,踩了不少坑。于是寫了個測試代碼,如果你不想看我的代碼,可以跳到下面直接看總結(jié):
#include <string>
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
string str1;
cout << "str1:" << str1 << " length: " << str1.length() << " size: " << str1.size() << " capacity: " << str1.capacity() << endl;
string str2("hello");
cout << "str2:" << str2 << " length: " << str2.length() << " size: " << str2.size() << " capacity: " << str2.capacity() << endl;
string str3(4, 'A');
cout << "str3:" << str3 << " length: " << str3.length() << " size: " << str3.size() << " capacity: " << str3.capacity() << endl;
string str4(str2);
cout << "str4:" << str4 << " length: " << str4.length() << " size: " << str4.size() << " capacity: " << str4.capacity() << endl;
cout << "-----------------------------------------------" << endl;
char sz1[10] = { 0 };
sz1[0] = 'a';
sz1[1] = 'b';
sz1[2] = 'c';
char sz2[10] = { 0 };
sz2[0] = 'a';
sz2[3] = 'b';
sz2[4] = 'c';
string str5(sz1);
string str6(sz1, 2);
string str71(sz1, 4);
string str72(sz1, 10);
string str73(sz1, 30);
cout << "str5:" << str5 << " length: " << str5.length() << " size: " << str5.size() << " capacity: " << str5.capacity() << endl;
cout << "str6:" << str6 <<" length: " << str6.length() << " size: " << str6.size() << " capacity: " << str6.capacity() << endl;
cout << "str71:" << str71 << " length: " << str71.length() << " size: " << str71.size() << " capacity: " << str71.capacity() << endl;
cout << "str72:" << str72 << " length: " << str72.length() << " size: " << str72.size() << " capacity: " << str72.capacity() << endl;
cout << "str73:" << str73 << " length: " << str73.length() << " size: " << str73.size() << " capacity: " << str73.capacity() << endl;
cout << "-----------------------------------------------" << endl;
string str8(sz2);
string str9(sz2, 1);
string str10(sz2, 2);
string str11(sz2, 4);
string str12(sz2, 10);
cout << "str8:" << str8 <<" length: " << str8.length() << " size: " << str8.size() << " capacity: " << str8.capacity() << endl;
cout << "str9:" << str9 << " length: " << str9.length() << " size: " << str9.size() << " capacity: " << str9.capacity() << endl;
cout << "str10:" << str10 << " length: " << str10.length() << " size: " << str10.size() << " capacity: " << str10.capacity() << endl;
cout << "str11:" << str11 << " length: " << str11.length() << " size: " << str11.size() << " capacity: " << str11.capacity() << endl;
cout << "str12:" << str12 << " length: " << str12.length() << " size: " << str12.size() << " capacity: " << str12.capacity() << endl;
cout << "-----------------------------------------------" << endl;
string str13 = sz1;
string str14 = sz2;
cout << "str13:" << str13 << " length: " << str13.length() << " size: " << str13.size() << " capacity: " << str13.capacity() << endl;
cout << "str14:" << str14 << " length: " << str14.length() << " size: " << str14.size() << " capacity: " << str14.capacity() << endl;
cout << "-----------------------------------------------" << endl;
string str15;
str15.append(sz1);
string str16;
str16.append(sz1, 2);
cout << "str15:" << str15 << " length: " << str15.length() << " size: " << str15.size() << " capacity: " << str15.capacity() << endl;
cout << "str16:" << str16 << " length: " << str16.length() << " size: " << str16.size() << " capacity: " << str16.capacity() << endl;
cout << "-----------------------------------------------" << endl;
string str17;
str17.append(sz2);
string str18;
str18.append(sz2, 3);
string str19;
str19.append(sz2, 10);
cout << "str17:" << str17 << " length: " << str17.length() << " size: " << str17.size() << " capacity: " << str17.capacity() << endl;
cout << "str18:" << str18 << " length: " << str18.length() << " size: " << str18.size() << " capacity: " << str18.capacity() << endl;
cout << "str19:" << str19 << " length: " << str19.length() << " size: " << str19.size() << " capacity: " << str19.capacity() << endl;
cout << "-----------------------------------------------" << endl;
string str20;
str20 += sz1;
string str21;
str21 += sz2;
cout << "str20:" << str20 << " length: " << str20.length() << " size: " << str20.size() << " capacity: " << str20.capacity() << endl;
cout << "str21:" << str21 << " length: " << str21.length() << " size: " << str21.size() << " capacity: " << str21.capacity() << endl;
cout << "-----------------------------------------------" << endl;
string str22;
str22.assign(sz1);
string str23;
str23.assign(sz1, 9);
string str24;
str24.assign(sz1, 15);
cout << "str22:" << str22 << " length: " << str22.length() << " size: " << str22.size() << " capacity: " << str22.capacity() << endl;
cout << "str23:" << str23 << " length: " << str23.length() << " size: " << str23.size() << " capacity: " << str23.capacity() << endl;
cout << "str24:" << str24 << " length: " << str24.length() << " size: " << str24.size() << " capacity: " << str24.capacity() << endl;
cout << "-----------------------------------------------" << endl;
string str25;
str25.assign(sz2);
string str26;
str26.assign(sz2, 4);
string str27;
str27.assign(sz1, 15);
cout << "str25:" << str25 << " length: " << str25.length() << " size: " << str25.size() << " capacity: " << str25.capacity() << endl;
cout << "str26:" << str26 << " length: " << str26.length() << " size: " << str26.size() << " capacity: " << str26.capacity() << endl;
cout << "str27:" << str27 << " length: " << str27.length() << " size: " << str27.size() << " capacity: " << str27.capacity() << endl;
cout << "-----------------------------------------------" << endl;
printf("%s\n", str26.c_str());
printf("%s\n", str26.data());
return 0;
}
輸出結(jié)果是:

現(xiàn)總結(jié)如下:
1. 將char*賦值給std::string如果不指定長度,則會默認(rèn)以\0截斷(ASCII碼值為0);如果指定的長度超過char*字符串的長度,用std::cout系列的函數(shù)輸出時,會把不屬于該char*之后的內(nèi)存值打印出來。而對于printf系列的函數(shù)來打印std::string時遇到\0也會截斷,因而不能完全顯示。這點在打印或輸出到日志時,這類字符串時需要特別注意。
2. 如果是單個字符和一個字符串賦值給std::string寫法是有區(qū)別的 —— 對于char,數(shù)目是第一個參數(shù),對于char* 數(shù)目是第二個參數(shù)。
例如,假定ptsr是一個字符串或者字符。如果pstr是一個字符串,那么要寫成string(pstr, n),如果pstr是一個字符,那么要寫成string(n, pstr),而此時string(pstr, n)是一個錯誤的寫法,可能會導(dǎo)致你的程序產(chǎn)生莫名其妙的問題,因為如果pstr是一個負(fù)值,負(fù)數(shù)轉(zhuǎn)換成無符號整數(shù)size_t類型,n將非常大,會導(dǎo)致構(gòu)造字符串時length非常大導(dǎo)致std::string構(gòu)造時拋出異常??催@兩種初始化的構(gòu)造函數(shù)簽名:
string (const char* s, size_t n); string(size_t n, char c);
請注意這個區(qū)別?。√貏e容易想當(dāng)然地寫錯。如果pstr對應(yīng)數(shù)值比較小的正數(shù),可能不會產(chǎn)生異常,但其實程序狀態(tài)也不是你想要的。如果是負(fù)數(shù),程序?qū)⒅苯赢a(chǎn)生異常。拋出:std::length_error 。所以出現(xiàn)這個異常信息,你就要好好檢查下你初始化std::string的長度信息了。
相關(guān)文章
C++分析類的對象作類成員調(diào)用構(gòu)造與析構(gòu)函數(shù)及靜態(tài)成員
終于到了對象的初始化和清理的最后階段了,在這里分享一個cpp里有多個類時,一個類的對象作為另一個類成員的時候構(gòu)造函數(shù)和析構(gòu)函數(shù)調(diào)用的時機(jī)。還有一個靜態(tài)成員也是經(jīng)??嫉降狞c,在這篇博客將會詳解其概念并舉出案例鞏固,讓我們開始2022-05-05
C++中關(guān)于多態(tài)實現(xiàn)和使用方法
這篇文章主要介紹了C++中關(guān)于多態(tài)實現(xiàn)和使用方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-07-07
C++?Qt開發(fā)之使用QNetworkAccessManager實現(xiàn)Web網(wǎng)頁訪問
Qt?是一個跨平臺C++圖形界面開發(fā)庫,利用Qt可以快速開發(fā)跨平臺窗體應(yīng)用程序,本文主要介紹了如何運(yùn)用QNetworkAccessManager組件實現(xiàn)Web網(wǎng)頁訪問,需要的可以參考下2024-03-03
C語言popen函數(shù)調(diào)用其他進(jìn)程返回值示例詳解
這篇文章主要為大家介紹了C語言popen函數(shù)調(diào)用其他進(jìn)程返回值示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09
VC++實現(xiàn)View內(nèi)容保存為圖片的方法
這篇文章主要介紹了VC++實現(xiàn)View內(nèi)容保存為圖片的方法,涉及VC++中Bitmap類的save方法相關(guān)使用技巧,需要的朋友可以參考下2016-08-08

