使用getline

时间:2015-10-15 13:03:48

标签: c++ regex c++11 boost

bool validateCurrencyLine(string line){
    cout << "TESTING LINE : " << line << endl;
    string pattern = "[ ]*([A-Z]{3}) ([0-9]+)([ ]*|,[0-9]+[ ]*)";
    boost::regex expr{pattern};
    return boost::regex_match(line,expr);
}

int main()
{
    string line;
    while(getline(cin,line)){
        cout << validateCurrencyLine(line) << endl;
    }
    return 0;
}

test文件的内容如下:

  

IDK 3453443

现在,当我使用./a.out < test启动程序时,结果为

TESTING LINE : IDK 3453443
0
TESTING LINE : 
0

我的假设是打印第二行,因为testfile第一行实际上是

  

IDK 3453443 +输入

我说错了吗?)

但真正的问题是,当我这样开始时:./a.out并输入“IDK 3453443”并按回车键。结果是:

TESTING LINE : IDK 3453443
1

为什么这两个结果有所不同?

1 个答案:

答案 0 :(得分:0)

确实,行结束是罪魁祸首。

在十六进制编辑器中查看文件,你会发现0d 0a行结束(Windows或CRLF),其中代码需要UNIX行结束(只是LF)。

现场直播:

<强> Live On Coliru

你可以通过“吃”来解决这个问题。最后的所有空白:

<强> Live On Coliru

std::string pattern = "[ ]*([A-Z]{3}) ([0-9]+)(,[0-9]+)?\\s*";

现在两人都被接受了。