【问题标题】:Convert vector<unsigned char> {1,2,3} into string "1-2-3" AS DIGITS将 vector<unsigned char> {1,2,3} 转换为字符串 "1-2-3" AS DIGITS
【发布时间】:2016-03-21 17:37:00
【问题描述】:

我想在屏幕上显示std::vector&lt;unsigned char&gt; 中的数字,但在发送给收件人的途中,我需要将这些数字填入std::string

无论我尝试什么(atoireinterpret_caststring.c_str() ...),都给了我一个废话,或者这些原始数字的字母表示 - 即它们对应的 ascii 字符。

那么我如何轻松(最好是标准方法)将vector&lt;unsigned char&gt; {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' 不是一回事。
  • 您如何使用 C# 或 Java 以简单的方式做到这一点?
  • @πάντα ῥεῖ 我刚刚发布了 C# 示例,肯定有可能改进:)

标签: c# c++ string vector data-conversion


【解决方案1】:

我是这样处理的:

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

【讨论】:

    【解决方案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;
    

    【讨论】:

    • OP 有一个vector&lt;unsigned char&gt; 而不是vector&lt;int&gt;
    • 绝对精彩的答案!这是我学习 C++11/14 的方法,非常感谢!
    • @Peter THX,但仍有改进您的问题的空间。可能会提供我评论中提到的样本。
    【解决方案3】:

    还有一个例子:

    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);
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-18
      • 2018-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-11
      相关资源
      最近更新 更多