c++ - 文字列 - c言語 記号 判定




入力がC++で数値か文字列かどうかを調べる (5)

私は入力(answer3)が数字か文字列かどうかをチェックするために次のコードを書いています。数字でない場合は "数字だけ入力"を返しますが、数値でも同じ結果を返します。 私に解決策を提案してください。

#include <iostream>
#include <string>
#include <typeinfo>
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

using namespace std; 
int main ()
{

string ques1= "Client's Name :";
string ques2 = "Client's Address :";
string ques3 = "Mobile Number :";

char answer1 [80];
string answer2;
int answer3;

     cout<<ques1<<endl;    
     cin>>answer1;      

     cout<<ques2<<endl;    
     cin>>answer2; 

     cout<<ques3<<endl;
     cin>>answer3;

       if (isdigit(answer3))
       {
              cout<<"Correct"<<endl;     

              }

        else
        {
          cout<<"Enter Numbers Only"<<endl;  

            }

 system("pause>null");
 return 0;  

}

isdigitへの入力は整数値です。 ただし、値が '0'〜 '9'に対応する場合にのみtrue(ゼロ以外)を返します。 整数値に変換すると、それらは48〜57です。 それ以外の値の場合、 isdigitはfalse(ゼロ)を返します。

チェックロジックを変更することで整数があるかどうかを確認することができます:

if ( cin.fail() )
{
   cout<<"Correct"<<endl;     
}
else
{
   cout<<"Enter Numbers Only"<<endl;  
}

C ++ 98を使用している場合は、 stringstreamsを使用できます( #include <sstream> )。

std::string s = "1234798797";
std::istringstream iss(s);

int num = 0;

if (!(iss >> num).fail()) {
    std::cout << num << std::endl;
}
else {
    std::cerr << "There was a problem converting the string to an integer!" << std::endl;
}

boostが利用可能ならlexical_cast#include <boost/lexical_cast.hpp> )を使うことができます:

std::string s = "1234798797";
int num = boost::lexical_cast<int>(si);//num is 1234798797
std::cout << num << std::endl;

C ++ 11が利用できる場合は、 <string>組み込みstd::stoi 関数を使用できます。

std::string s = "1234798797";
int mynum = std::stoi(s);
std::cout << mynum << std::endl;

出力:

1234798797

これはやや古い質問ですが、自分のコードで使用している自分のソリューションを追加したいと考えました。

文字列が数値かどうかを調べるもう一つの方法はstd::stod関数ですが、これは少し違っています。 私の使用例では、try-catchブロックを使用して、入力が文字列か数値かをチェックします。

...
try {
    double n = stod(answer3);
    //This will only be reached if the number was converted properly.
    cout << "Correct" << endl;
} catch (invalid_argument &ex) {
    cout << "Enter Numbers Only" << endl;
}
...

この解決策の主な問題は、数字で始まる文字列(ただしすべての数字ではない) 数値に変換されることです。 これは、返されたstd::to_stringに対してstd::to_stringを使用し、元の文字列と比較することで簡単に修正できます。


strtodを使った別の答え:

bool isNumber(const std::string& s){
   if(s.empty() || std::isspace(s[0]) || std::isalpha(s[0])) return false ;
   char * p ;
   strtod(s.c_str(), &p) ;
   return (*p == 0) ;
}

任意のタイプのパラメータを使用してテンプレートを使用できるようにするには、次のようにします。

#include <sstream>

template<typename T>
bool isNumber(T x){
   std::string s;
   std::stringstream ss; 
   ss << x;
   ss >>s;
   if(s.empty() || std::isspace(s[0]) || std::isalpha(s[0])) return false ;
   char * p ;
   strtod(s.c_str(), &p) ;
   return (*p == 0) ;
}

注意:

  1. 空白はそれをfalseに戻します。
  2. NANINFはfalseを返すようにします(正確な指数を除くすべての文字はfalseを返します)。 naninfを許可する場合は、 || std::isalpha(s[0]) || std::isalpha(s[0])部分です。
  3. すなわち、1e + 12が真を返します。
  4. Double / floatまたはintegerはtrueを返します。
  5. これは、 正規表現の答えよりも効率的です。 (正規表現は重い)。

関心のある現象は、 isdigitcharunsigned charキャストする必要があることです。 ( こちらも参照)。





string-conversion