C++ 要求标准输入的有效浮点输入精度为2英寸C++;

C++ 要求标准输入的有效浮点输入精度为2英寸C++;,c++,parsing,C++,Parsing,假设我们正在使用std::cin或从文件中读取浮点,并希望强制执行以下条件,即它后面有两个小数位: 例如 4.01(有效) 4.001(无效-后面有三个小数位) a、 47(无效,在“a”和“,”中有两个非[0-9]字符) #556.53(无效,有“#”) (就上下文而言,在我的示例中,我正在解析一个文本文件,其中有几个条目由空格分隔,验证每个输入,并将它们存储在一个结构中以供进一步处理。) 我们怎么做 我在stackoverflow中从其他来源找到了这个 下面是实现。我们以字符串形式读取,并

假设我们正在使用std::cin或从文件中读取浮点,并希望强制执行以下条件,即它后面有两个小数位:

例如
4.01(有效)
4.001(无效-后面有三个小数位)
a、 47(无效,在“a”和“,”中有两个非[0-9]字符)
#556.53(无效,有“#”)

(就上下文而言,在我的示例中,我正在解析一个文本文件,其中有几个条目由空格分隔,验证每个输入,并将它们存储在一个结构中以供进一步处理。)


我们怎么做

我在stackoverflow中从其他来源找到了这个

下面是实现。我们以字符串形式读取,并且只接受任何字符而不是数字(在perl中,我想我们可以简单地执行regex非匹配[0-9])

显然,字符串中的find_first_not_方法为我们实现了这一点:

  std::string a;

  if(!(std::cin>>a)){
    std::cout << "Invalid float entry " << std::endl;
  }

  if(a.find_first_not_of("1234567890.-")!=std::string::npos){
    std::cout << "Invalid string to float" << std::endl;}

如果你有一个C++编译器和标准库来实现C++ 11,那么你可以使用正则表达式,这是非常简单的:

#include <iostream>
#include <regex>
#include <string>

int main(int argc, char** argv) {
    std::string pattern("[-+]?\\d+\\.\\d\\d$");
    std::regex reg(pattern);
    for (int i = 1; i < argc; ++i) {
      std::cout << argv[i]
                << (std::regex_match(argv[i], reg) ? " matched\n" : " didn't match\n");
    }
    return 0;
}
#包括
#包括
#包括
int main(int argc,字符**argv){
字符串模式(“[-+]”?\\d+\.\\d\\d$”;
std::regex-reg(模式);
对于(int i=1;istd::你能不能不提你正在使用的语言。但这听起来像是正则表达式的工作。类似于
\d+\。\d{2}
C++现在有正则表达式。你是坚持要求值正好有两个小数位数,还是最多有两个?我坚持它正好有两个小数位数。回答得很好。谢谢你提供正则表达式匹配的提示。
float u = stof(a);
#include <iostream>
#include <regex>
#include <string>

int main(int argc, char** argv) {
    std::string pattern("[-+]?\\d+\\.\\d\\d$");
    std::regex reg(pattern);
    for (int i = 1; i < argc; ++i) {
      std::cout << argv[i]
                << (std::regex_match(argv[i], reg) ? " matched\n" : " didn't match\n");
    }
    return 0;
}