首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何知道文本文件中的输入是否为c++中的有效数字

如何知道文本文件中的输入是否为c++中的有效数字
EN

Stack Overflow用户
提问于 2018-08-24 06:33:19
回答 3查看 158关注 0票数 1

我是C++的新手,所以即使这看起来是一个简单的问题,我仍然不知道如何解决它。所以我有一个文本文件,其中包含一堆数字。有些不是有效的数字,可能是3.12ad、t3等。当我使用下面的代码时,它不能区分它是否读取了错误的数字,或者它只是简单地完成了文件的读取(两种情况都会给我一个错误消息)。所以我的问题是,我如何才能捕捉到糟糕的数字情况?谢谢。

代码语言:javascript
复制
int main() {
string line;
int numOfLine = 0;
int inputNum = 0;
float num;
vector<float> arr1;
vector<float> arr2;
ifstream infile11("test.txt");
while (true) {
        if (infile11 >> num) {
            arr1.push_back(num);
            inputNum ++;
            cout<<num<<endl;
        }
        if ((infile11 >> num).fail()) {
            cout<<"Error"<<endl;
            return 0;
        }
    }
}
EN

回答 3

Stack Overflow用户

发布于 2018-08-24 06:46:20

您可以使用正则表达式来检查您获得的字符串是否为数字。如果我没记错的话,在C++中它在#include < regex >中。以便可以使用regex_match()函数。正则表达式可以是这样的:"?\d*(.\d+)?“。

票数 0
EN

Stack Overflow用户

发布于 2018-08-24 22:03:32

您可以使用标准转换函数(https://en.cppreference.com/w/cpp/string/basic_string/stof)。如果不允许转换,则会引发异常。下面是一个示例:

代码语言:javascript
复制
#include <string>
#include <iostream>
#include <vector>

int main()
{
    std::vector<std::string> numbers {"3.14", "10", "t3", "toto"};
    for (auto& nb : numbers)
    {
        bool correct = true;
        for (auto& c : nb)
        {
            try
            {
                std::stof(std::string(&c));
            }
            catch(const std::exception&)
            {
                correct = false;
                break;
            }
        }
        if (!correct)
        {
            std::cout << "Cannnot convert [" << nb << "]\n";
        }
        else
        {
            std::cout << "Correct conversion [" << nb << "]\n";
        }
    }
}
票数 0
EN

Stack Overflow用户

发布于 2018-08-24 23:05:35

您的问题需要更多有关什么是有效数值的详细信息。但是,在这里做一些假设(例如没有逗号、1/2之类的分数或科学记数法),您可以在其他答案中建议的正则表达式或转换尝试之外使用的一个简单算法是:

代码语言:javascript
复制
For each line until EOF [end of file]
   While current character is whitespace
       advance pointer to next character
   if currentCharacter = '-'
       advance pointer to next character
   decimalEncountered = false
   For each character
       if character >= 0 and character <= 9
            advance pointer to next character
       else if character == '.'
            if (decimalEncountered)
                 exit loop reporting invalid numeric
            else 
                 decimalEncountered = true
       else if character == EOF [end of file]
            exit loop; no invalid numerics encountered
       else if character == line break
            go to next iteration of outer loop
       else
            exit loop reporting invalid numeric

我提供的伪代码只是为了让具体的实现看起来像家庭作业练习一样;希望这是一个有用的方向的有用指针!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51995147

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档