2016-11-24 52 views
0

我有一個指向未知長度的緩衝器中的字符指針:拷貝第一n個字符到的std :: string

char* buffer; 

我需要複製前N(N是輸入變量)字符以如果N!= 0,則爲std :: string。 我當前的代碼是:

int N = <something>; 
std::string text; 
if (N != 0) 
    text.assign(buffer, N); 
else 
    text.assign(buffer); 

我不喜歡的事情,就是當緩衝區的大小小於N,結果文本的大小是N.

是否有在任何功能標準庫將緩衝區的前N個字符複製到文本而不會將文本的大小強制爲N?

即如果緩衝只有1個炭和N = 100,我想要text.size()= 1

是一個定製的拷貝,逐字節,將溶液?

+0

如果您使用C++,最好使用'std :: string'和相關的方法和運算符 –

+1

如果您需要知道字符串的長度,我們共享Universe的物理基本定律需要掃描字符串直到找到終止的'\ 0'字節。周圍沒有捷徑。 –

+0

@SamVarshavchik我不需要知道緩衝區的長度。我只需要複製拳頭N個字符。 – Daniele

回答

2

您可以使用memchr去尋找零字節,並且將搜索範圍限制爲N字節:

size_t N = ...; 
char* pos = memchr(buffer, '\0', N); 
text.assign(buffer, pos ? pos - buffer : N); 

如果沒有找到的字節,輸出字符串的長度應爲N,如果它的發現,那麼memstr返回指向它的指針。減去原始指針將產生所需的長度。

這不會以任何特殊的方式處理N = 0的情況 - 也就是說,如果N爲0,則輸出將爲空。如果你想要其他行爲,請爲它做一個特例。

+0

是的!謝謝!這很有幫助! – Daniele