我是C++的新手,所以即使这看起来是一个简单的问题,我仍然不知道如何解决它。所以我有一个文本文件,其中包含一堆数字。有些不是有效的数字,可能是3.12ad、t3等。当我使用下面的代码时,它不能区分它是否读取了错误的数字,或者它只是简单地完成了文件的读取(两种情况都会给我一个错误消息)。所以我的问题是,我如何才能捕捉到糟糕的数字情况?谢谢。
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;
}
}
}
发布于 2018-08-24 06:46:20
您可以使用正则表达式来检查您获得的字符串是否为数字。如果我没记错的话,在C++中它在#include < regex >中。以便可以使用regex_match()函数。正则表达式可以是这样的:"?\d*(.\d+)?“。
发布于 2018-08-24 22:03:32
您可以使用标准转换函数(https://en.cppreference.com/w/cpp/string/basic_string/stof)。如果不允许转换,则会引发异常。下面是一个示例:
#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";
}
}
}
发布于 2018-08-24 23:05:35
您的问题需要更多有关什么是有效数值的详细信息。但是,在这里做一些假设(例如没有逗号、1/2之类的分数或科学记数法),您可以在其他答案中建议的正则表达式或转换尝试之外使用的一个简单算法是:
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
我提供的伪代码只是为了让具体的实现看起来像家庭作业练习一样;希望这是一个有用的方向的有用指针!
https://stackoverflow.com/questions/51995147
复制相似问题