gpt4 book ai didi

c++ - 如何在 C++ 中使用 istream&、string& 和 getline 读取复杂输入?

转载 作者:搜寻专家 更新时间:2023-10-31 02:04:31 24 4
gpt4 key购买 nike

我是 C++ 的新手,所以如果这不是一个好问题,我深表歉意,但我确实需要帮助来理解如何使用 istream。

我必须创建一个项目,它需要在一行或多行上输入几笔输入,然后将其传递给一个 vector (这只是项目的一部分,我想尝试其余的我自己的),例如,如果我要输入这个...

>> aaa    bb
>> ccccc
>> ddd fff eeeee

用“aaa”、“bb”、“ccccc”、“ddd”、“fff”、“eeeee”制作一个字符串 vector

输入可以是字符或字符串,当按下回车键时程序停止请求输入。

我知道 getline() 获取一行输入,我可能会使用 while 循环来尝试获取输入,例如...(如果我错了请纠正我)

while(!string.empty())
getline(cin, string);

但是,我并不真正理解 istream,而且我的类(class)没有遍历指针也无济于事,所以我不知道如何使用 istream& 或 string& 并将其传递到 vector 中。在项目描述中,它说不使用 stringstream,而是使用 getline(istream&, string&) 中的功能。谁能详细解释一下如何使用 getline(istream&, string&) 创建一个函数,然后如何在主函数中使用它?

一点点帮助!

最佳答案

您已经走对了路;唯一的是,您必须用一些虚拟字符预先填充字符串才能完全进入 while 循环。更优雅:

std::string line;
do
{
std::getline(std::cin, line);
}
while(!line.empty());

如果用户输入一个空行,这应该已经完成​​了逐行阅读(但可能在一行中有多个单词!)并退出的技巧(请注意,空格后跟换行符不会被识别为这样!) .

但是,如果流中出现任何错误,您将陷入无限循环,一次又一次地处理先前的输入。所以最好也检查流状态:

if(!std::getline(std::cin, line))
{
// this is some sample error handling - do whatever you consider appropriate...
std::cerr << "error reading from console" << std::endl;
return -1;
}

由于一行中可能有多个单词,因此您还必须将它们分开。 有几种方法可以做到这一点,一个非常简单的方法是使用 std::istringstream——你会发现它与你可能习惯使用 std 的东西很相似: :cin:

    std::istringstream s(line);
std::string word;
while(s >> word)
{
// append to vector...
}

请注意,使用 operator>> 会忽略前导空格并在第一个尾随空格(或到达流末尾,如果到达)后停止,因此您不必明确处理。

好的,你不能使用 std::stringstream(我用的是 std::istringstream ,但我想这个小差异不算数,是吗?)。变化有点重要,它变得更复杂,另一方面,我们可以自己决定什么算作单词,什么算作分隔符……我们可能会像空格一样将标点符号视为分隔符,但允许数字成为单词的一部分,所以我们会接受e。 G。 ab.7c d"ab", "7c", "d":

auto begin = line.begin();
auto end = begin;
while(end != line.end()) // iterate over each character
{
if(std::isalnum(static_cast<unsigned char>(*end)))
{
// we are inside a word; don't touch begin to remember where
// the word started
++end;
}
else
{
// non-alpha-numeric character!
if(end != begin)
{
// we discovered a word already
// (i. e. we did not move begin together with end)
words.emplace_back(begin, end);
// ('words' being your std::vector<std::string> to place the input into)
}
++end;
begin = end; // skip whatever we had already
}
}
// corner case: a line might end with a word NOT followed by whitespace
// this isn't covered within the loop, so we need to add another check:
if(end != begin)
{
words.emplace_back(begin, end);
}

调整什么是分隔符和什么算作单词的不同解释应该不会太难(例如 std::isalpha(...) || *end == '_' 检测下划线作为单词的一部分,但不检测数字)。有不少helper functions你可能会发现有用的...

关于c++ - 如何在 C++ 中使用 istream&、string& 和 getline 读取复杂输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53379153/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com