【问题标题】:How to check whether an input is integer, string or float in C++如何在 C++ 中检查输入是整数、字符串还是浮点数
【发布时间】:2017-08-29 14:06:26
【问题描述】:

我想知道的是,如果我要求用户输入一些东西,如果输入是整数、字符串或浮点值,我将如何输出。我想要一些方法来检查 C++14 中输入的数据类型。

例如。

如果输入是“Hello world”

输出应该是:“输入是字符串”

如果输入是“134”

输出应该是:“输入是整数”

如果输入是“133.23”

输出应该是:“输入是浮点数”

【问题讨论】:

  • 例如,1e1 是什么 - 整数、浮点数还是字符串?
  • 您可以尝试转换它。本质上,这意味着以字符串的形式读取一行(使用getline),然后例如把它放在istringstream 中并尝试从中读取任何你想要的内容。如果失败,则输入不是那样。
  • 默认情况下,cin 会接受用户的 String 输入。它是否只包含数字字符,或者最后是 floatf,可以通过遍历 chars 来检查String 并检查每个 char
  • 你能给我看一个不是字符串的输入示例吗?
  • bool is_double(const std::string& s) { std::istringstream iss(s);双 d;返回 iss >> d >> std::ws && iss.eof(); }

标签: c++ c++14


【解决方案1】:

读取字符串。

<string> 中,标准库提供了一组函数,用于从字符串或wstring 中的字符表示中提取数值。

使用x=stoi(s,p)。检查p - 如果读取了整个字符串 - 它是整数。

x=stof(s,p)x=stod(s,p)x=stold(s,p) 执行相同操作以检查float/double/long double。

如果一切都失败了 - 它是字符串。

【讨论】:

    【解决方案2】:

    用户总是会输入一个字符串,你可以尝试将其转换为浮点数,如果成功则可能是浮点数或整数。 如果浮点转换不成功,那么它可能不是数字。

    【讨论】:

      【解决方案3】:
      #include <iostream>
      #include <string>
      #include <boost/variant.hpp>
      #include <sstream>
      
      
      using myvariant = boost::variant<int, float, std::string>;
      
      struct emit : boost::static_visitor<void>
      {
          void operator()(int i) const {
              std::cout << "It's an int: " << i << '\n';
          }
      
          void operator()(float f) const {
              std::cout << "It's a float: " << f << '\n';
          }
      
          void operator()(std::string const& s) const {
              std::cout << "It's a string: " << s << '\n';
          }
      };
      
      auto parse(const std::string& s) -> myvariant
      {
          char* p = nullptr;
      
          auto i = std::strtol(s.data(), &p, 10);
          if (p == s.data() + s.size())
              return int(i);
      
          auto f = std::strtof(s.data(), &p);
          if (p == s.data() + s.size())
              return f;
      
      
          return s;
      }
      
      void test(const std::string& s)
      {
          auto val = parse(s);
          boost::apply_visitor(emit(), val);
      }
      
      int main()
      {
          test("Hello world");
          test("134");
          test("133.23");
      }
      

      预期输出:

      It's a string: Hello world
      It's an int: 134
      It's a float: 133.23
      

      【讨论】:

        【解决方案4】:

        输入是一个字符串。如果没有额外的约定,你怎么可能知道用户想要“1”是包含字符“1”的字符串还是整数1的字符串表示形式?

        如果你决定“如果它可以被解释为一个 int,那么它就是一个 int。如果它可以是一个双精度,那么它就是一个双精度。否则它是一个字符串”,那么你可以做一系列的转换,直到一个工作,或者做一些格式检查,也许使用正则表达式。

        由于所有整数都可以转换为双精度,并且双精度的字符串表示形式可以转换为整数(可能还有一些垃圾),如果您关心差异,您可能需要检查它是否为双精度(可能带有 . 的数字,可能是 'e',后面可能带有 +/-。等等。您可以在 Internet 上找到正则表达式,具体取决于您要允许的内容、前导 +、电子符号等。

        如果是 int,则可以使用正则表达式 ^\d+$,否则如果是 double,则 [+-]?(?:0|[1-9]\d*)(?:.\d*) ?(?:[eE][+-]?\d+)?否则它是一个字符串。

        这里有一些似乎可以工作的代码。 :)

        #include <iostream>
        #include <string>
        #include <regex>
        using namespace std;
        
        
        void handleDouble(double d) {
            std::cout << "Double = " << d << "\n";
        }
        
        void handleInt(int i) {
            std::cout << "Int = " << i << "\n";
        }
        
        void handleString(std::string const & s) {
            std::cout << "String = " << s << "\n";
        }
        
        void parse(std::string const& input) {
            static const std::regex doubleRegex{ R"([+\-]?(?:0|[1-9]\d*)(?:\.\d*)?(?:[eE][+\-]?\d+)?)" };
            static const std::regex intRegex{ R"(\d+)"};
        
            if (std::regex_match(input, intRegex)){
                istringstream inputStream(input);
                int i;
                inputStream >> i;
                handleInt(i);
            }
            else if (std::regex_match(input, doubleRegex)) {
                istringstream inputStream(input);
                double d;
                inputStream >> d;
                handleDouble(d);
            }
            else {
                handleString(input);
            }
        }
        
        int main()
        {
            parse("+4.234e10");
            parse("1");
            parse("1.0");
            parse("123abc");
        }
        

        输出:

        Double = 4.234e+10
        Int = 1
        Double = 1
        String = 123abc
        

        【讨论】:

          【解决方案5】:

          您可以轻松地将string.strof 换成floatstring.stroi 换成int 在try-catch 块中:

          #include <string>
          bool isFloat(string str) {
              try {
                  float floatCheck = stof(str);
                  return true;
              }
              catch (...) {
                  return false;
              }
          }
          
          bool isInt(string str) {
              try {
                  int intCheck = stoi(str);
                  return true;
              }
              catch (...) {
                  return false;
              }
          }
          

          【讨论】:

            猜你喜欢
            • 2022-01-10
            • 1970-01-01
            • 2018-03-20
            • 2020-05-05
            • 2019-10-05
            • 1970-01-01
            • 2011-04-22
            相关资源
            最近更新 更多