[英]C++: C string to std:string
我正在嘗試使用函數將C字符串轉換為std :: string。 該功能可以在64位gcc (GCC) 4.8.3 20140911 (Red Hat 4.8.3-9)
。 但是,當我使用-O2
或-O3
優化進行編譯時,它會出現段錯誤。 它與-O1
工作。 任何人都可以提出修復建議或解決方法嗎? 功能如下:
void make_name(unsigned const &i, string &h_file)
{
char h_str[10];
sprintf(h_str, "tmp/%09d.hb", i);
h_file = string(h_str);
}
簡單:提供足夠的緩沖區。 或使用std::stringstream
。
char h_str[10];
sprintf(h_str, "tmp/%09d.hb", i);
這是未定義的行為。 您正在嘗試將約十七個字節的數據寫入一個十字節的數組中:
tmp/
是四。 %09d
將至少擴展到九個。 .hd
是三個。 \\0
為1。 不要那樣做 未定義的行為意味着所有功能保證都是無效的。
實際上,如果您想成為一名真正的體面的C ++開發人員,則應盡可能避免使用遺留的東西。
學習時以及需要在C和C ++中運行的庫代碼都很好。 但是,對於C ++代碼,使用語言的非傳統部分要健壯得多。
以下程序顯示了如何執行此操作而不必還原到cstdio/stdio.h
的舊版C東西:
#include <iostream>
#include <iomanip>
#include <sstream>
using namespace std;
void make_name (unsigned int i, string &h_file) {
stringstream ss;
ss << "tmp/" << setw(9) << setfill('0') << i << ".hb";
h_file = ss.str();
}
int main() {
string s;
make_name (42u, s);
cout << s << '\n';
return 0;
}
順便說一句,您將看到我已更改您的方法簽名以按值傳遞
i
。 那是因為我不確定將其用作const
引用是否有任何優勢。 如果你找到一個優勢隨意改回來。
最好不要使用C字符串。
std::string make_name(unsigned i)
{
std::ostringstream str;
str << "tmp/" << std::setfill('0') << std::setw(9) << i << ".hb";
return std::move(str.str());
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.