【问题标题】:How to properly convert std::string to an integer vector如何正确地将 std::string 转换为整数向量
【发布时间】:2020-11-10 19:56:23
【问题描述】:

我的高级目标是通过将每个字符转换为整数,将任何字符串(可以包括非 ascii 字符)转换为整数向量。

我已经有一个python代码sn-p用于这个目的:

bytes = list(text.encode())

现在我想要一个 C++ 等价物。我尝试了类似的东西

int main() {
  char const* bytes = inputText.c_str();
  long bytesLen = strlen(bytes);
  auto vec = std::vector<long>(bytes, bytes + bytesLen);
  for (auto number : vec) {
      cout << number << endl;
  }
  return 0;
}

对于像“testΔ”这样的输入字符串,python 代码输出 [116, 101, 115, 116, 206, 148]。

但是 C++ 代码输出 [116, 101, 115, 116, -50, -108]。

我应该如何更改 C++ 代码以使它们保持一致?

【问题讨论】:

  • “我知道如何用另一种语言做到这一点”不是使用该语言标签的理由。
  • 如果您使用 unicode 字符,则不能使用 char*,您可能希望使用宽字符和 unicode 文字 stackoverflow.com/questions/6796157/… 例如 Python 的 str.encode 默认使用 utf-8,所以这里是C++中对utf-8支持的解释stackoverflow.com/questions/50403342/…
  • 如果您坚持使用 ASCII 空间,那么向量中的无符号数据类型应该会有很大帮助。
  • @user4581301 Δ 不在 ASCII 空间中。
  • 确实如此。那天晚上我在看电视,显然是外星人建造了金字塔。也许他们也对三角形负责。

标签: c++


【解决方案1】:

但是 C++ 代码输出 [116, 101, 115, 116, -50, -108]。

在 C++ 中,char 类型与 signed charunsigned char 是分开的,并且未指定是否应该对其进行签名。

因此,您明确需要unsigned char*,但.c_str 方法为您提供char *,因此您需要强制转换。您将需要reinterpret_cast 或 C 风格的演员; static_cast will not work.

【讨论】:

  • 明确一点:static_cast 将适用于单个元素,但不适用于指针。
  • 感谢卡尔。我修改了我的代码并确认它正在工作。非常感谢您的帮助(以及下面的其他 cmets)
【解决方案2】:

您可以很好地遍历std::string 的内容,无需将其转换为std::vector。试试这个:

int main()
{
    std::string str = "abc";
    for (auto c : str)
    {
        std::cout << static_cast<unsigned int>(c) << std::endl;
    }
}

这里需要static_cast 只是因为标准operator&lt;&lt; 按原样输出char,而不是数字。否则,您可以像使用任何其他整数类型一样使用它。我们将其转换为 unsigned int 以确保输出严格为正,因为 char 的符号是实现定义的。

【讨论】:

  • 感谢您的建议!我的用例实际上需要 vecotr 明确。我添加 cout 只是为了帮助解释我的问题
  • @ireneisgood 你可以这样构建它:std::vector&lt;unsigned long&gt; result(str.begin(), str.end());
【解决方案3】:

我应该如何更改 C++ 代码以使它们保持一致?

不同之处似乎在于 Python 使用 unsigned char 值,而 char 在您的 C++ 实现中已签名。一种解决方案:将字符串重新解释为 unsigned char 的数组。

【讨论】:

    猜你喜欢
    • 2017-01-16
    • 2012-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    相关资源
    最近更新 更多