1

我正在尝试从命令提示符读取有效的用户输入:

例如,有效的用户输入格式如下:

获取数据 <>

<> - 任何字符串类型值

在命令提示符下:

eg getData name => Correct (getData 后面只输入了一个参数) eg getData name ID => InCorrect (getData 后面输入了多个参数) eg getData => InCorrect (getData 后面没有输入参数)

如何检查参数的数量?我的代码逻辑如下:

string cmd_input;

getline(cin, cmd_input)

stringstream ss(cmd_input);

string input;
string parameter;

 ss >> input; //getData
 ss >> parameter; //name

如何进行有效/无效检查?我不想通过循环运行它,直到 EOF 流并计算参数的数量。我阅读了 peek() 并不确定它如何适合这里。另外,我不想使用向量来存储参数。

谢谢!

4

4 回答 4

1

您可以在检索输入后检查流本身的状态。如果检索成功,它将是truetrue您希望它在两次检索后返回,但false在第三次。

if (!(ss >> input1) || input1 != "getData") { //... error : unexpected cmd
}
if (!(ss >> input2)) { //... error: no param
}
if (ss >> input3) { //... error: too many params
}
//... okay
于 2013-10-04T22:03:36.680 回答
1

在不使用循环和甚至不使用的约束下std::vector,它可能看起来像以下方式:

std::string line, command, arg1, arg2, arg3;

if (std::getline(std::cin, line)) {

    std::istringstream is(line);
    if (is >> command) {
        std::string word;
        if (is >> arg1) {
            ...
            if (is >> arg2) {
                ...
                if (is >> arg3) {
                     ...
                }
            }
        }
    } // end of is >> command
}

但是,如果您改变主意并决定使用std::vector,它可能如下所示:

std::string line, command;
std::vector<std::string> arguments;

if (std::getline(std::cin, line)) {

    std::istringstream is(line);
    if (is >> command) {
        std::string word;
        while (is >> word)
            arguments.push_back(word);
    }
}
于 2013-10-04T22:05:04.783 回答
0
ss >> input;
if( ss.eof() )
    //no parameter code
else
{
    ss >> param;
    if( !ss.eof() )
         // too many param code
    else
         // good input
}
于 2013-10-04T22:03:54.557 回答
0

这是一个简单的测试程序读取commands。如果提取了commandis getDataone 参数,并且如果成功,则跳过任何尾随空格。此时解析该行的流预计已经结束,即eof()需要设置:

#include <iostream>
#include <sstream>
#include <string>

int main()
{
    for (std::string line; std::getline(std::cin, line); ) {
        std::istringstream in(line);
        std::string command, name;
        if (in >> command) {
            if (command == "getData" && in >> name && (in >> std::ws).eof()) {
                std::cout << "getData: read one argument: '" << name << '\n';
            }
            else {
                std::cout << "wrong format on line '" << line << "'\n";
            }
        }
    }
}
于 2013-10-04T22:06:26.173 回答