2011-11-23 20 views
1
複製寬字符串

比方說,我有一個寬字符串這樣
使用std ::複製到Windows上

std::wstring s(L"Stack Over Flow"); 

,我想複製到寬字符std::vector<wchar_t>向量(的空值終止字符串)使用std::copy
以下兩個方法似乎工作
首先

std::vector<wchar_t> c(s.size() + 1); 
std::copy(s.c_str(), s.c_str() + s.length() + 1, c.begin()); 
wprintf(L"%s\n",&c[0]); 


std::vector<wchar_t> d(s.size() + sizeof(wchar_t)); 
std::copy(s.c_str(), s.c_str() + s.length() + sizeof(wchar_t), d.begin()); 
wprintf(L"%s\n",&d[0]); 

但我想第一個應該失敗,因爲我沒有爲結尾空字符分配正確的大小。我錯過了什麼?
編輯
不,我不希望這個

std::vector<wchar_t> c(s.begin(), s.end()); <br> 

因爲我調整現有緩衝
編輯
通過改變使用案例(使用C樣打印API)我可以看到第二個版本可能是正確的。
首先打印Stack Over Flow????????
預期

回答

6

二打印Stack Over Flow爲什麼這麼多的大雜燴?

我不知道你爲什麼不這樣做:

std::vector<wchar_t> c(s.begin(), s.end()); 

簡單,而簡潔!

至於你的代碼,兩個版本都是錯誤的。兩者都是錯誤的,因爲第二個參數超出了結尾,因爲它應該只有s.c_str() + s.length()。也就是,

2nd arg ---> s.c_str() + s.length() //correct 

2nd arg ---> s.c_str() + s.length() + 1 //wrong - first version 
2nd arg ---> s.c_str() + s.length() + sizeof(wchar_t) //wrong - second version 

如果您遵循簡單的代碼,慣用代碼,您可以避免大量的錯誤。


如果使用std::copy,例如,當你不能使用矢量構造函數出於某種原因,那麼慣用std::copy是這樣的:

void f(std::vector<wchar_t> & c) 
{ 
    //you cannot use constructor version now, so use std::copy as 
    std::copy(s.begin(), s.end(), std::back_inserter(c)); 
} 

編輯:

如果您正在使用C庫和使用C字符串的API,那麼我建議您使用std::wstring(或std::string)。我在使用std::vector時看不到多少意思,因爲它增加了代碼的混淆。如果使用矢量,你必須在最後追加一個空字符,這樣才能使其工作:

c.push_back('\0'); //do this after copying! 

但我還沒有看到這樣做的任何一點,如你想治療矢量像一個字符串。如果你需要字符串,爲什麼不使用std::wstring和它的std::wstring::c_str()來獲取字符串。

+0

一個用於常見原因將'std :: wstring'複製到'vector '是在調用期望以空值終止的'wchar_t *'的API時。 – MSalters

+0

如果你說*爲什麼*兩個版本都是錯誤的,你會從我得到+1 ;-) – rubenvb

+0

@rubenvb:完成。 – Nawaz

1

首先:當您有尺寸感知容器時,實際上並不需要結尾空字符。

其次,此構造函數爲std::vector<T>需要T元素的數量,而不是字節。所以+1意味着一個額外的wchar_t(0)

在編輯的問題,最簡單的解決方案似乎c.assign(s.begin(), s.end())

3

當你問一個std ::向量C(大小),它分配足夠的空間來容納大小wchar_t的項目 - 你要的大小不是以字節爲單位,但在wchar_t的項目

相關問題