簡體   English   中英

C ++將std :: string復制到char數組,沒有空終止

[英]C++ copy std::string to char array with no null termination

我正在使用只包含char [32]的結構寫入二進制文件。 我基本上需要通過對字符串數組執行各種計算並連接結果來格式化每個數據塊。 我試圖將std :: string復制到沒有空終止的char數組。 我讀到的越多,我就越困惑。 如果我做:

struct block{
    char data[32];
};
block blocks[2048];
std::string buffer;

buffer = "12345678123456781234567812345678";
strcpy(blocks[0].data, buffer.c_str());

我得到一個錯誤,因為使用c_str()添加空終止符使字符串長度為33.如果我從字符串中減去一個字符,它可以工作,但是我有空終結符,我不想要。 我可以成功地做到以下幾點:

strcpy(blocks[0].data, "12345678123456781234567812345678");

但我想先構造字符串,因為它通常涉及連接各種數組的不同字符串。 例如,我可以用std :: string來做到這一點:

std::string buffer = stringArray1[0] + stringArray2[0];
strcpy(blocks[0].data, buffer.c_str());

但后來我再次使用null終止符。 我只想復制std :: string中的字符而沒有空終止符。

我使用的是VC ++ 6.0。

您不能使用strcpy因為它會查找NULL終止符以標識字符串的結尾,並將NULL復制到輸出字符串。

因為你要從string轉到char緩沖區,最簡單的方法是使用std::copy

#include <algorithm>

static const size_t data_size = 32;
struct block{
    char data[data_size];
};

/* ... */

std::string buffer = stringArray1[0] + stringArray2[0];
std::copy( buffer.begin(), buffer.end(), blocks[0].data );

順便說一下,你可以使用vector<char> ,而不是char data[32]

編輯:

拋開:VC6是一個古老的編譯器,它出來時很糟糕,當C ++標准被批准時很糟糕,並且完全沒有得到微軟的支持。 如果出現問題,他們甚至不會跟你說話。 你應該盡快離開VC6。

使用memcpy而不是strcpy ,這就是它的用途:

memcpy(blocks[0].data, buffer.data(), sizeof(blocks[0].data)); 

使用strncpy()而不是strcpy()

strncpy(blocks[0].data, buffer.c_str(), 32); 

使用以下其中一行

memcpy(blocks[0].data, buffer.c_str(), buffer.size());
memcpy(blocks[0].data, buffer.c_str(), 32);
memcpy(blocks[0].data, buffer.c_str(), buffer.size() > 32 ? 32 : buffer.size());
std::copy(buffer.begin(), buffer.end(), blocks[0].data).

順便說一下,當字符串短於32個字符時,你會處理這種情況嗎? 你想附加一個空字節嗎?

暫無
暫無

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

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