【问题标题】:How to properly operate with wstrings?如何正确操作 wstrings?
【发布时间】:2020-09-10 14:59:25
【问题描述】:

我正在学习 wstrings,因为我想了解一个项目的 UTF-8。我做了一个简单的程序来测试使用 wstrings 的操作:

int main()
{
   std::wstring test;
   std::wstring test2;
   std::wstring test3;
   int n;

   getline(std::wcin, test);

   std::wcout << "\n" << test;

   for (n = 0; n < test.size(); n++)
   {
      test[n] += n * n;
      test2[n] = test[n];
   }
   std::wcout << test2 << "\n";

   for (n = 0; n < test2.size(); n++)
   {
    test2[n] -= n * n;
    test3[n] = test[n];
   }
   std::wcout << test3 << "\n";

  return 0;
}

当我执行它时,我得到这个错误:“字符串下标超出范围”

这是我的第一个 C++“严肃”项目,感谢任何帮助!

【问题讨论】:

  • 请注意 std::wstringsutf-8 不太可能相关,例如在 Windows 上 std::wstringutf-16 编码
  • 真的吗?我实际上有点迷失了。我认为我需要 wstrings,因为由于某种原因,当我使用 std::string 时,test2 和 test3 中的字符不会通过 Unicode 字符的 0 - 255 部分。谢谢你的信息。
  • 是的,您应该在 c++20 中使用 std::u8string 或在存储 utf-8 之前使用 std::string en.cppreference.com/w/cpp/string/basic_string
  • @GuilhermeGaldino std::wstring 使用 wchar_t 元素,在 Windows 上为 2 个字节,在其他平台上为 4 个字节。所以 std::wstring 在 Windows 上是 UTF-16 编码的,在其他平台上是 UTF-32 编码的。 std::string 使用 char 元素,在所有平台上都是 1 字节大小。在 C++20 之前,std::string 可以保存 UTF-8 编码的字符串。 C++20 为此添加了char8_tstd::u8string。任何 UTF 编码的字符串都可以处理整个 Unicode。但大多数 Windows API 函数只喜欢本地 ANSI 或 UTF-16 字符串。

标签: c++ visual-c++ c++17 wstring


【解决方案1】:

你的test2 字符串是空的,所以当你这样做时:

test2[n] = test[n];

您正在一个无效的位置建立索引,这会调用未定义的行为。这可能会导致抛出异常。

相反,您可以这样做:

test2.push_back(test[n]);

test3 也有同样的问题,可以用同样的方法解决。


或者,一旦你读入test,你可以用适当数量的元素初始化test2test3

getline(std::wcin, test);

std::wstring test2(test.size());
std::wstring test3(test.size());

现在您可以毫无问题地索引这些字符串。


另外,对于您的问题,您甚至不需要对test2 进行任何索引。一旦你修改了test,你可以像这样简单地分配它:

for (n = 0; n < test.size(); n++)
{
      test[n] += n * n;
}
std::wstring test2 = test;

test3 也是如此。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-12
    • 2015-06-25
    相关资源
    最近更新 更多