2011-11-23 73 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的项目

相关问题