检查输入有效性?

时间:2014-05-17 15:41:37

标签: c++ validation input

我想从一个文本文档中读入信息,这些信息写成名称,空格和小数值。例如,文件中的一行可能包含:

老虎56.3

我需要做的是验证第一部分是仅包含字母的字符串,第二部分仅包含包含小数的数字。到目前为止,我有以下基本代码:

ifstream input("data.txt");
while(!input.eof())
{
    string name;
    double score;

    input >> name;
    input >> score;

}

我该怎么做?

4 个答案:

答案 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;
        }
    }
}