我想从一个文本文档中读入信息,这些信息写成名称,空格和小数值。例如,文件中的一行可能包含:
老虎56.3
我需要做的是验证第一部分是仅包含字母的字符串,第二部分仅包含包含小数的数字。到目前为止,我有以下基本代码:
ifstream input("data.txt");
while(!input.eof())
{
string name;
double score;
input >> name;
input >> score;
}
我该怎么做?
答案 0 :(得分:1)
您可能需要查看新的C++11
Regular Expressions。
它们专门用于输入验证等任务。
检查字符串是否仅包含数字以及+
或-
符号的最小示例可能如下所示:
#include <iostream>
#include <regex>
#include <string>
int main()
{
std::string testString;
std::regex integer("(\\+|-)?[[:digit:]]+");
input >> testString;
if(std::regex_match(input, integer))
std::cout << "Valid number" << std::endl;
else
{
std::cout << "No valid number" << std::endl;
}
}
但是你需要一个非常新的编译器(我认为是GCC 4.9)来使用它们。如果您无法使用此功能,则可以使用Boost Regex Library,它提供了非常相似的界面。
答案 1 :(得分:0)
将数据读入字符串并从那里解析:
std::string name, score_str;
while (input >> name >> score_str)
{
if (!is_alphabetic(name) || !is_decimal_number(score_str)) {
// error
}
else {
// convert score_str to a double and assign it to score
}
}
以下是is_alphabetic
:
template<class iter>
bool is_alphabetic(iter beg, iter end)
{
bool found_number = true;
while (beg != end && (found_number = !std::isdigit(*beg++)))
;
return found_number;
}
template<class container>
bool is_alphabetic(container& c)
{
return is_alphabetic(c.begin(), c.end());
}
答案 2 :(得分:0)
#include<iostream>
#include<string>
using namespace std;
int validate(string,string);
int main(){
string s;
string d;
cin>>s>>d;
if(validate(s,d)) cout<<"ok";
else cout<<"not ok";
}
int validate(string s, string d){
for(int i=0;i<s.size();++i){
//all either small letter or capital letter else error
if(!((s[i]>='A' && s[i]<='Z') || (s[i]>='a' && s[i]<='z'))){
return 0;
}
}
int f=0;
for(int i=0;i<d.size();++i){
//either digits or decimal
if(!((d[i]>='0' && d[i]<='9') || d[i]=='.')){
return 0;
}
//if decimal already present and again decimal its an error ex. 123.23.23
if(d[i]=='.' && f==1) return 0;
//flag indicating decimal present
if(d[i]=='.') f=1;
if(d[i]>='0' && d[i]<='9' && f==1) f=2; // validate decimal like 132. (not valid)
}
if(f==1) return 0;
return 1;
}
答案 3 :(得分:0)
这里最简单的代码是:
while(!input.eof())
{
string name;
string score;
input >> name;
for (int i=0; i<name.size() ; i++) {
if ( ( name [i] >= 'A' && name [i] <= 'Z' ) || ( name [i] >= 'a' && name [i] <= 'z' ) || (name [i] == '_') ) {
continue;
} else {
cout <<"Name is not valid!";
break;
}
}
input >> score;
for (int j=0; j<score.size() ; j++) {
if ((score [j] >= '0' && score [j] <= '9') || (score[j]=='.') ) {
continue;
} else {
cout <<"Number is not valid!";
break;
}
}
}