【问题标题】:Reading integer then rest of the line as a single string from input从输入中读取整数,然后将行的其余部分作为单个字符串读取
【发布时间】:2021-12-22 12:19:43
【问题描述】:

假设我正在尝试从以下 input.txt 中读取

6 Jonathan Kim Jr
2 Suzie McDonalds
4 Patty

... 我想将每行的第一个整数和其余字符串存储为字符串变量。这是我尝试过的:

int num;
string name1, name2, name3;   
while ( ins >> num >> name1 >> name2 >> name3 )
{  
    // do things
}

不幸的是,这不起作用,因为第 2 行和第 3 行只有 2 个和 1 个字符串,因此循环将在第一个循环处终止。

有没有办法将整数之后的其余字符串存储在单个变量中,包括空格?例如,字符串变量name 将持有:

"Jonathan Kim Jr" // first loop
"Suzie M"         // second loop
"Patty"           // third loop

我也考虑过使用 getline 来实现这一点,但这需要我将整数与字符串隔离开来,我希望有更好的方法来做到这一点。也许使用向量?

【问题讨论】:

    标签: c++ input newline getline


    【解决方案1】:

    默认情况下,>> 运算符在空格上分割,因此您可以使用它将整数拉入变量中。然后,您可以使用 getline 获取该行的其余部分,并将其存储到变量中。

    示例(如果您从 std::cin 读取):

    int num;
    std::string name;
    std::cin >> num;
    std::getline(std::cin, name);
    

    【讨论】:

    • 不要忘记在每个事务之后测试流状态,以确保没有任何读取失败。在这里添加if (std::cin) { use num and name } else { clean up and handle error } 是个好主意。
    • 哇,太棒了。我以为即使我们执行 cin >> num,getline 也会再次获取整数,但显然,这不是真的!非常感谢!
    【解决方案2】:

    为什么不使用正则表达式 (https://en.wikipedia.org/wiki/Regular_expression) 来解析 (https://en.cppreference.com/w/cpp/regex) 输入?我认为一个表达式类似于 2 个子表达式:

    '^([0-1]+)\s([A-Za-z0-9_-/s]+)'

    【讨论】:

    • 要回答您的问题,他们可能没有想到或不知道这是可能的。
    猜你喜欢
    • 2013-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-20
    • 2021-05-06
    • 2022-09-28
    • 2015-04-11
    相关资源
    最近更新 更多