1

重複の可能性:
文字列を int C++ に変換
する 文字列が数値かどうかを確認する最速の方法は何ですか?

文字列を int に変換する必要があり、変換が成功したかどうかを知る必要があります。でも number は 0 になる可能性があるので、atoiなどは使用できません。ファイルから読み取った変換する文字列。

4

3 に答える 3

5

このテンプレート関数を使用できますが、これは文字列をintに変換するためだけのものではなく、文字列をすべての型に変換するためのものです。

template <typename T>
T ConvertString( const std::string &data )
{
  if( !data.empty( ))
  {
    T ret;
    std::istringstream iss( data );
    if( data.find( "0x" ) != std::string::npos )
    {
      iss >> std::hex >> ret;
    }
    else
    {
      iss >> std::dec >> ret;
    }

    if( iss.fail( ))
    {
      std::cout << "Convert error: cannot convert string '" << data << "' to value" << std::endl;
      return T( );
    }
    return ret;
  }
  return T( );
}

変換が成功したかどうかを確認したい場合は、ifに特定の値を返すiss.fail()か、関数に2番目の参照引数を渡し、失敗した場合は値をfalseに設定します。

次のように使用できます。

uint16_t my_int = ConvertString<uint16_t>("15");

参照引数を使用したソリューションが気に入った場合は、ここに例を示します。

#include <iostream>
#include <sstream>
#include <string>

#include <inttypes.h>

template <typename T>
T ConvertString(const std::string &data, bool &success)
{
  success = true;
  if(!data.empty())
  {
    T ret;
    std::istringstream iss(data);
    if(data.find("0x") != std::string::npos)
    {
      iss >> std::hex >> ret;
    }
    else
    {
      iss >> std::dec >> ret;
    }

    if(iss.fail())
    {
      success = false;
      return T();
    }
    return ret;
  }
  return T();
}

int main(int argc, char **argv)
{
  bool convert_success;
  uint16_t bla = ConvertString<uint16_t>("15", convert_success);
  if(convert_success)
    std::cout << bla << std::endl;
  else
    std::cerr << "Could not convert" << std::endl;
  return 0;
}
于 2012-12-11T07:09:23.040 に答える
4

古き良きstrtolもご用意しております。C++ コードでは、次のように使用するのが最適#include <cstdio>ですstd::strtol

#include <cstdlib>

//...

std::string str;
char *endp;

// change base 10 below to 0 for handing of radix prefixes like 0x
long value = std::strtol(str.c_str(), &endp, 10); 

if (endp == str.c_str()) { 
    /* conversion failed completely, value is 0, */ 
    /* endp points to start of given string */ 
}
else if (*endp != 0) {
    /* got value, but entire string was not valid number, */ 
    /* endp points to first invalid character */ 
}
else {
    /* got value, entire string was numeric, */
    /* endp points to string terminating 0 */ 
}
于 2012-12-11T07:28:00.070 に答える
2

ストリームを使用する(c ++):

std::string intString("123");

int result;
std::stringstream stream(intString);

if (stream >> result) {
    std::cout << result;
} else {
    std::cout << "there was an error parsing the string";
}
于 2012-12-11T07:18:39.313 に答える