簡體   English   中英

C ++:將C字符串轉換為std:string

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM