2016-03-21 62 views
1

我想在屏幕上显示std::vector<unsigned char>中的数字,但在前往收件人的途中,我需要将这些数字填入std::string将矢量<无符号字符> {1,2,3}转换为字符串“1-2-3”AS DIGITS

无论我尝试过什么(atoi,reinterpret_cast,string.c_str() ...),都给了我这些原始数字的无意义或字母表示 - 即它们对应的ASCII字符。

那么我该如何轻松(最好是标准方法)将vector<unsigned char> {1,2,3}转换为string "1-2-3"

在原始文章(稍后编辑)我提到,我可以在C#或Java中做到这一点。 在πάνταῥεῖ在C#或Java提供例子的要求,这里是一个快速的LINQ C#的方式:

public static string GetStringFromListNumData<T>(List<T> lNumData) 
    { 
     // if (typeof(T) != typeof(IConvertible)) throw new ArgumentException("Expecting only types that implement IConvertible !"); 
     string myString = ""; 
     lNumData.ForEach(x => myString += x + "-"); 
     return myString.TrimEnd('-'); 
    } 
+1

'1'和''1''不是一回事。 – NathanOliver

+0

您会如何以_easy方式使用C#或Java来做到这一点? –

+0

@πάνταῥεῖ我刚刚发布了C#示例,肯定是可能改进的主题:) –

回答

2

只需使用一个std::ostringstream

std::vector<unsigned char> v{1,2,3}; 
std::ostringstream oss; 
bool first = true; 
for(auto x : v) { 
    if(!first) oss << '-'; 
    else first = false; 
    oss << (unsigned int)x; 
} 
std::cout << oss.str() << std::endl; 
+0

OP有一个'vector '而不是'vector '。 – NathanOliver

+0

@NathanOliver THX指出,固定。 –

+0

绝对高明的答案!以下是我学习C++ 11/14 非常感谢! –

3

这里是我如何处理:

std::vector<unsigned char> v {1, 2, 3}; 

std::string s; // result 

auto sep = ""; // continuation separator 
for(auto n: v) 
{ 
    s += sep + std::to_string(n); 
    sep = "-"; // change the continuation separator after first element 
} 

std::cout << s << '\n'; 

延续分隔符从第一个输出开始排空并得到改变吨。

输出:

1-2-3 
+0

另一个优秀的答案 - 谢谢你的灵感.. –

2

但是,另一个例子:

std::vector<unsigned char> v{1,2,3}; 

std::ostringstream str; 
std::transform(v.begin(), v.end(), std::ostream_iterator<char>(str, "-"), [](unsigned char c){ return '0' + c;}); 

std::cout << str.str(); 

[编辑]

不幸上面会添加额外的尾部-符号,以防止它 - 更复杂的代码是必要的:

std::transform(v.begin(), v.end(), std::ostream_iterator<std::string>(str), [&](auto c){ 
    return (str.rdbuf()->in_avail() ? "-" : "") + std::to_string(c); 
}); 
相关问题