2011-12-01 57 views
5

我正在使用一個只包含char [32]的結構寫入二進制文件。我基本上需要通過對字符串數組執行各種計算並連接結果來格式化每個數據塊。我試圖將一個std :: string複製到一個沒有空終止的char數組中。我讀得越多,我就越困惑。如果我做的:C++拷貝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()); 

但是然後我再次有空終止符。我只想複製std :: string中沒有空終止符的字符。

我正在使用VC++ 6.0。的strcpy

+5

你知道,VC++ 6.0就像IE 6 Hidious。如果您能夠切換編譯器,可以做到這一點並且快速。 –

+0

謝謝大家的回覆。我結束了使用memcpy;我曾嘗試過,錯誤地使用std :: string.c_str而不是std :: string.data。此外,我們通常使用VS2010,但這是一款傳統產品,需要一些尚未更新的舊庫以支持任何過去的VS6.0。 –

回答

10

使用memcpy相反,這正是它的存在爲:

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

在C++中使用'std :: copy'沒有任何錯誤 –

+2

@ AlfP.Steinbach:當然。我選擇了'memcpy',因爲它最接近OP已經擁有的內容,並且他們會很樂於使用它。我想如果這是你第一次遇到'std :: copy'版本,就不能這麼說。 – Jon

+0

正是我需要的。謝謝!我也會熟悉std :: copy,但是你是對的:我猛地抨擊了memcpy,它工作正常。 –

15

不能使用strcpy因爲尋找NULL結束識別字符串的結尾,和NULL複製到輸出字符串。

既然你從string去一個字符緩衝區,最簡單的做法是使用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。

+0

@Nim:那是怎麼回事? –

+0

+1,對我來說很好! :) – Nim

+0

謝謝你的答案和建議。爲了簡單起見,我最終使用了memcpy,但我會熟悉這些方法。 –

-1

使用下面

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). 

BTW的線路之一,你辦理的情況下,當字符串是少於32個字符?你想追加一個空字節嗎?

+1

不,'memcpy'接受目的地作爲第一個參數 - 傳遞'c_str()'字符串是沒用的...... – Nim

+2

Minor nitpick:'buffer.data()'比'buffer.c_str ()'(儘管它不會有所作爲)。 – Jon

+1

memcpy的簽名是'void * memcpy(void * destination,const void * source,size_t num)'所以你的例子是複製錯誤的方式。 – bames53

0

使用strncpy()代替strcpy()

strncpy(blocks[0].data, buffer.c_str(), 32); 
相關問題