5

次のコードは を に変換しますstd::stringint問題は、真の整数または単なるランダムな文字列と区別できないという事実にあります。このような問題に対処するための体系的な方法はありますか?

#include <cstring>
#include <iostream>
#include <sstream>

int main()
{
    std::string str =  "H";

    int int_value;
    std::istringstream ss(str);
    ss >> int_value;

    std::cout<<int_value<<std::endl;

    return 0;
}

編集:これは非常に最小限でエレガントなので、私が気に入ったソリューションです! 負の数では機能しませんが、とにかく正の数だけが必要でした。

#include <cstring>
#include <iostream>
#include <sstream>

int main()
{
    std::string str =  "2147483647";

    int int_value;
    std::istringstream ss(str);

    if (ss >> int_value)
        std::cout << "Hooray!" << std::endl;

    std::cout<<int_value<<std::endl;


    str =  "-2147483648";
    std::istringstream negative_ss(str);

    if (ss >> int_value)
        std::cout << "Hooray!" << std::endl;

    std::cout<<int_value<<std::endl;

    return 0;
}
4

3 に答える 3

7

Boost を使用してみてくださいlexical_cast。キャストが失敗した場合は例外がスローされます。

int number;
try
{
     number = boost::lexical_cast<int>(str);
}
catch(boost::bad_lexical_cast& e)
{
    std::cout << str << "isn't an integer number" << std::endl;
}

EDIT @chrisによるとstd::stoi、C++ 11以降を使用することもできます。std::invalid_argument変換を実行できなかった場合、例外がスローされます。ここで詳細情報を見つけることができます: std::stoi

于 2013-04-24T00:59:02.013 に答える
1
/* isdigit example */
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main ()
{
  char str[]="1776ad";
  int year;
  if (isdigit(str[0]))
  {
    year = atoi (str);
    printf ("The year that followed %d was %d.\n",year,year+1);
  }
  return 0;
}
于 2013-04-24T07:56:17.300 に答える