控制台应用程序中的一行中的cin / getline

时间:2016-05-14 10:48:20

标签: c++ cin getline

所以我有下一个问题,我试图输入两个字符串,一个可以是null其他必须。我试过

 cin>> param1>>param2

请注意,param1不能为null param 2可以为null。当param2为空时不起作用。

接下来我尝试使用getline(cin,param1)getline(cin,param2) 这有效,但我需要在控制台应用程序中提供两行参数。

我需要在一行中从控制台param1,param2中读取。 请注意,我是这种编程语言的初学者。

由于

3 个答案:

答案 0 :(得分:2)

cin用于读取,因此流方向是反向的:

cin >> param1 >> param2;

答案 1 :(得分:1)

是的,这不起作用,因为cin然后等待第二个参数。 您需要使用getline()并手动解析字符串。

一种可能性是这样做:

string params, param1, param2;
getline(cin, params);
istringstream str(params);
str >> param1 >> param2;

请注意,如果只传递了一个参数,则param2将为空,因为stringstream结束(cin不结束)。

话虽如此,这仍然不适用于像 "parameter 1 with spaces" "parameter 2 with spaces" 因为istream只是在空格上分割而不处理引号。

通常,当应用程序需要参数时,argc的{​​{1}}和argv参数用于从应用程序命令行获取它们(引用也起作用)

答案 2 :(得分:1)

cinstd::istream的模型。对于任何istream,stream >> x的结果是对istream本身的引用。

istream包含一些标志,用于指示先前操作的成功或失败。

istream也可转换为bool。如果先前的操作成功,则bool的值将为true,否则将为false(出于任何原因)。

因此,如果我们愿意,我们不仅可以链接>>操作,还可以连接其他支票。

这可能有点先进,但我认为你会发现它很有趣。 您可以按原样编译和运行该程序。

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


struct success_marker
{
    success_marker(bool& b)
    : _bool_to_mark(std::addressof(b))
    {}

    void mark(bool value) const {
        *_bool_to_mark = value;
    }
    bool* _bool_to_mark;
};

std::istream& operator>>(std::istream& is, success_marker marker)
{
    marker.mark(bool(is));
    return is;
}

success_marker mark_success(bool& b) {
    return success_marker(b);
}

void test(const std::string& test_name, std::istream& input)
{
    bool have_a = false, have_b = false;
    std::string a, b;

    input >> std::quoted(a) >> mark_success(have_a) >> std::quoted(b) >> mark_success(have_b);

    std::cout << test_name << std::endl;
    std::cout << std::string(test_name.length(), '=') << std::endl;
    std::cout << have_a << " : " << a << std::endl;
    std::cout << have_b << " : " << b << std::endl;
    std::cout << std::endl;
}

int main()
{
    std::istringstream input("\"we have an a but no b\"");
    test("just a", input);

    // reset any error state so the stream can be re-used
    // for another test
    input.clear();

    // put new data in the stream
    input.str("\"the cat sat on\" \"the splendid mat\"");
    // test again
    test("both a and b", input);

    return 0;
}

预期产出:

just a
======
1 : we have an a but no b
0 :

both a and b
============
1 : the cat sat on
1 : the splendid mat