簡體   English   中英

C樣式字符串和c ++ std :: string的函數

[英]Function for both C-style strings and c++ std::string

我有一個操作字符串的函數,並且我需要它同時適用於C樣式的字符串和C ++ std :: string:

// C-style overload
void TransformString(const char *in_c_string, char *out_string);
// C++ std::strings overload
std::string TransformString(const std::string &in_string);

為了避免冗余代碼,我只能在其中一個中實現實際的算法,然后讓另一個調用它。 因此,如果將實現放在C ++重載函數中,則C樣式函數將如下所示:

void TransformString(const char *in_c_string, char * out_c_string) {
   std::string in_string(in_c_string);
   std::string out_string = TransformString(in_string); // call C++ std::string overload
   strcpy(out_c_string, out_string.c_str()); // unwanted memory copy
}

我的問題是:我可以這樣做(僅在一個函數中實現算法)而沒有多余的副本(從std::string內部緩沖區到C樣式字符串)嗎? 我的第一個想法是嘗試像字符串移動構造函數那樣“竊取”緩沖區,但是在網上搜索時似乎沒有安全的方法,因為它是實現特定的。 而且,如果我使用C風格的函數編寫算法,則問題與C ++函數中的問題相同,我必須為char*字符串分配空間,然后將其移至std::string對象。
我必須提到,在完成轉換之前,我不知道結果字符串的大小。

謝謝。

編輯

緩沖區的大小在這里不是問題(我知道最大大小,該函數會收到分配的緩沖區)。 我不能只返回std :: string.c_str(),因為當銷毀std :: string對象時(在返回發生之后),緩沖區將變得無效。 我已經更改了變量out_c_string的名稱。 (感謝0x499602D2)

只要知道輸出緩沖區需要多大,就可以創建std::string並將其大小調整為緩沖區大小。 然后,您可以將指向std::string緩沖區的指針傳遞給C風格的重載。

#include <cstring>
#include <iostream>
#include <string>

void TransformString(const char *in_c_string, char *out_c_string) {
    size_t length = strlen(in_c_string);

    for (size_t i = 0; i < length; ++i)
        out_c_string[i] = '*';

    out_c_string[length] = 'a';
    out_c_string[length+1] = 'b';
    out_c_string[length+2] = 'c';
    out_c_string[length+3] = '\0';
}

std::string TransformString(const std::string &in_string) {
    std::string out;
    out.resize(100);

    TransformString(in_string.c_str(), &out[0]);
    out.resize(strlen(&out[0]));

    // IIRC there are some C++11 rule that allows 'out' to
    // be automatically moved here (if it isn't RVO'd)
    return out;
}

int main() {
    std::string string_out = TransformString("hello world");

    char charstar_out[100];
    TransformString("hello world", charstar_out);

    std::cout << string_out << "\n";
    std::cout << charstar_out << "\n";

    return 0;
}

這是一個實時示例: http : //ideone.com/xwVWCh

您可以嘗試使用c_str()從字符串類中獲取c樣式字符串。 您必須執行const_cast<char*>刪除const。

僅當您不需要重新分配字符串(保持相同大小)時,這才起作用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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