如何在C++11中将u32string转换为int?

hiz5n14c  于 2022-12-05  发布在  其他
关注(0)|答案(3)|浏览(248)

如何在C++11中将u32string转换为int
另外,我应该使用什么方法将这样的字符串转换为int-假设有开始和结束迭代器可用?
我试过了:

u32string test=U"14";
cout << atoi(test.c_str());

但它抛出:

candidate function not viable: no known conversion from 'const char32_t *' to 'const char *' for 1st argument
extern int atoi (__const char *__nptr)
fxnxkyjh

fxnxkyjh1#

#include <locale>   // wstring_convert
#include <codecvt>  // codecvt_utf8
#include <iostream> // cout
#include <string>   // stoi and u32string

int main() {
  std::wstring_convert<std::codecvt_utf8<char32_t>, char32_t> convert;

  std::u32string str = U"14";
  std::cout << std::stoi(convert.to_bytes(str));
}

这取决于UTF-8和使用相同数字表示法的“C”语言环境。
愚者的标准库实现libstdc还不包括codecvt头文件或std::wstring_convert。libc包括这两个,就像Visual Studio的标准库实现一样。如果你必须使用libstdc++,你会发现自己实现一个简单的转换函数是最简单的。

#include <algorithm> // transform
#include <iterator>  // begin, end, and back_inserter

std::string u32_to_ascii(std::u32string const &s) {
  std::string out;
  std::transform(begin(s), end(s), back_inserter(out), [](char32_t c) {
    return c < 128 ? static_cast<char>(c) : '?';
  });
  return out;
}

int u32toi(std::u32string const &s) { return stoi(u32_to_ascii(s)); }
5n0oy7gb

5n0oy7gb2#

编辑是因为我的第一个答案很愚蠢。
这是我设法做的,但它可能不是很有效,它假设你的字符串是有效的。

#include <string>
#include <iostream>

int     main()
{
  std::u32string str = U"14";

  std::string res;
  for (auto c = str.begin(); c != str.end(); ++c)
    {
      char t = *c;
      res.push_back(t);
    }
  std::cout << "\nVal = " << atoi(res.c_str()) << std::endl;
  return (0);
}
vmdwslir

vmdwslir3#

没有标准的库函数,但谢天谢地,它很容易实现。
下面是一个示例,说明如何以一种通用的方式进行转换,而无需进行代价高昂的std::string转换。

#include <string>
#include <iostream>

template<typename Out, typename In>
Out parse_int(In const& in)
{
    Out res = 0;
    std::size_t start = 0;
    while (std::isspace(in[start])) {
        start++;
    }
    std::size_t i = start;
    if (in[i] == '-') {
        i++;
    }
    while (std::isdigit(in[i])) {
        res = res * 10 + in[i++] - '0';
    }

    return in[start] == '-' ? -res : res;
}

int main()
{
    std::u32string s{ '1','2','3','4','5' };

    std::cout << parse_int<long long>(s) << std::endl;
}

parse_int函数可与u16stringu32stringu8stringstringwstring一起使用,利用了在所有字符类型中使用相同值表示数字的事实。
Live demo

相关问题