8

C++11に変換u32stringするにはどうすればよいですか?int

さらに、そのような文字列の一部を変換するためにどの方法を使用する必要がintありますか? begin と end イテレータを使用できるとしましょう。

私はもう試した:

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)
4

2 に答える 2

7
#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" ロケールに依存します。


GCC の標準ライブラリ実装 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)); }
于 2013-05-16T18:01:26.673 に答える
0

私の最初の答えは愚かだったので編集しました。

これが私がなんとかしたことですが、おそらくあまり効率的ではなく、文字列が有効であると想定しています。

#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);
}
于 2013-05-16T17:30:16.480 に答える