2016-03-21 60 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); 
}); 
相關問題