1

コマンドプロンプトから有効なユーザー入力を読み取ろうとしています:

たとえば、有効なユーザー入力は次の形式です。

getData <>

<> - 任意の文字列型の値

コマンドプロンプトで:

例 getData name => 正しい (予想どおり getData の後に入力されたパラメーターは 1 つだけ) 例 getData name ID => 正しくない (getData の後に複数のパラメーターが入力された) 例 getData => 正しくない (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

入力を取得した後、ストリーム自体の状態を確認できます。取得に成功した場合は になりますtruetrue2 回取得した後に返してもらいたいのですがfalse、3 回目で取得します。

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

以下は、s を読み取る簡単なテスト プログラムcommandです。command1 つの引数がgetData抽出され、これが成功した場合、末尾の空白はスキップされます。この時点で、行を解析するストリームは最後に到達したと予想されます。つまり、次の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 に答える