0

我正在创建一个简单的函数 printNode,它接受一个 int 或字符串“all”,并打印相应的输出。该函数的 int 方面运行良好,但是当我调用

printNode all

该函数打印“错误:无效参数”,我似乎无法弄清楚原因。

int main() {
    ...
    getline(cin, line)
    stringstream lineStream(line);
    stringstream elineStream(line);
    printNode(lineStream, elineStream);
    ...
}


int printNode(stringstream& lineStream, stringstream& elineStream) {
//String aspect of printNode
int nodeid;
string name;

// Parsing nodeid or name
lineStream >> nodeid;

// If parsing to nodeid fails, check if input is string "all"
if (lineStream.fail()) {
    elineStream >> name;
    if (elineStream.fail()) {
        if (elineStream.eof()) {
            cout << "Error: too few arguments" << endl;
            return 0;
        }
        else {
            cout << "Error: invalid argument" << endl;
            return 0;
        }
    }
    if (name != "all") {
        cout << "Error: invalid argument" << endl;
        return 0;
    }
    // Check for too many arguments
    elineStream >> ws; 
    if (!elineStream.eof()) {
        cout << "Error: too many arguments" << endl; 
        return 0;
    }

    // Print output for input "all" 
    cout << "Print: all nodes" << endl;
    return 1;
}

任何帮助将非常感激。

4

2 回答 2

0

您将其printNode all作为输入提供,而它仅期望all. 我试过你的代码,它工作正常(当然,给它printNode all失败的参数无效)。

作为旁注,您可以通过清除第一个流上的错误标志来避免使用两个流。也就是说,如果您在看到它无法读取数字后添加,您elineStream可能只是。lineStreamlineStream.clear();


从你的措辞中,我看到了一些奇怪的东西,我也想澄清一下(以防万一):

但是当我打电话时

printNode all

通过在命令行中编写,您不会调用函数。编写时调用该函数:

printNode(lineStream, elineStream);

在您的源代码中。如果在命令行中编写printNode all,则所有字符串(因为您阅读了整行)都将被传输到流中,而不仅仅是all.

于 2013-10-04T15:36:17.090 回答
0

通过使用std::copywithstd::istream_iteratorstd::back_inserter将所有单词复制到std::vector. 然后就是简单的检查一下向量的大小,看看这个命令是否合法。

这条线:

std::vector<std::string> command_and_args;

std::copy(std::istream_iterator<std::string>(lineStream),
          std::istream_iterator<std::string>(),
          std::back_inserter(command_and_args));

if (command_and_args.size() == 0)
    std::cout << "Error: No command or arguments\n";
else if (command_and_args.size() == 1)
    std::cout << "Error: To few arguments\n";
else if (command_and_args.size() > 2)
    std::cout << "Error: To many arguments\n";
else
{
    // Got the command and one argument
    // Command in `command_and_args[0]`
    // Argument in `command_and_args[1]`
}

std::copy部分可用于所有命令,而检查必须是单独的。


编辑:实际上,检查参数的数量也可以是自动的,如果您创建一个详细说明命令的结构(命令字符串,布尔值来判断是否需要参数,最小参数数量,最大参数数量,std::function以及命令处理程序)。用这种结构创建一个表,并通过它查找命令,检查参数计数(如果需要),然后调用函数对象。然后函数对象可以检查各个参数。

于 2013-10-04T15:36:57.400 回答