web-dev-qa-db-ja.com

文字列をsize_tに変換する

std::stringsize_tに変換する方法はありますか?問題は、size_tがプラットフォーム依存型であることです(これはsizeofの結果です)。したがって、stringunsigned longまたはunsigned intに正しく変換できるとは保証できません。

編集:簡単なケースは次のとおりです:

std::cout<< "Enter the index:";
std::string input;
std::cin >> input;
size_t index=string_to_size_t(input);
//Work with index to do something
15
Humam Helfawi

scanfタイプのアプローチでは、%zdをフォーマット指定子として使用できます。

または、std::stringstream>>にオーバーロードするsize_tを使用します。

6
Bathsheba

std::stringstream

std::string string = "12345";
std::stringstream sstream(string);
size_t result;
sstream >> result;
std::cout << result << std::endl;
11
Yuriy Orlov

sscanf%zu指定子、std::size_t

sscanf(input.c_str(), "%zu", &index);

ご覧ください こちら

文字通り、オーバーロードされたoperator >>/std::basic_istringstream ために std::size_tこちら を参照してください。

9
Lingxi

size_texisting整数のtypedef、つまりunsigned intunsigned long、またはunsigned long longのいずれかと同じ幅であると、しばらく考えてみましょう。

AFAIR it could標準的な言い回しに関する限り、別の(より大きな)タイプであるが、私はその可能性は非常に低いと考えている。

size_tunsigned long longよりも大きいではないという仮定を使用して、 stoull または strtoull のいずれかでsize_tにキャストすると機能します。


同じ仮定(size_tまたはunsigned longのいずれかで定義されたunsigned long long)から、wouldそのタイプのoperator>>オーバーロードが存在します。

7
DevSolar
#include <sstream>

std::istringstream iss("a");
size_t size;
iss >> size;

Iss.fail()を使用して、失敗を確認します。 ( "a")の代わりに、変換する値を使用します。

1
selin kamaş
/**
   * @brief  Convert const char* to size_t
   * @note   When there is an error it returns the maximum of size_t
   * @param  *number: const char* 
   * @retval size_t
   */
  size_t to_size_t(const char *number) {
    size_t sizeT;
    std::istringstream iss(number);
    iss >> sizeT;
    if (iss.fail()) {
      return std::numeric_limits<size_t>::max();
    } else {
      return sizeT;
    }
  }
0