【问题标题】:cin / getline in one line in console app [closed]控制台应用程序中的一行中的 cin / getline [关闭]
【发布时间】:2016-05-14 10:48:19
【问题描述】:

所以我有下一个问题,我尝试输入两个字符串,一个可以为空,另一个必须为。我试过了

 cin>> param1>>param2

注意 param1 不能为 null 参数 2 可以为 null。当 param2 为 null 时不起作用。

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

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

谢谢

【问题讨论】:

  • 你为什么在每一个问题中都说“所以我有下一个问题”?这与任何问题有什么关系?

标签: c++ cin getline


【解决方案1】:

cin 用于读取,所以流方向是相反的:

cin >> param1 >> param2;

【讨论】:

  • 我修改了,不好意思,我赶时间
【解决方案2】:

是的,这不起作用,因为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 只是在空格上拆分并且不处理引号。

通常当应用程序需要参数时,main()argcargv 参数用于从应用程序命令行获取它们(引用也可以)

【讨论】:

    【解决方案3】:

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

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

    istream 也可以转换为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
    

    【讨论】:

      猜你喜欢
      • 2015-07-12
      • 2012-04-23
      • 1970-01-01
      • 1970-01-01
      • 2011-08-06
      • 1970-01-01
      • 2013-02-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多