提取操作符“>>”如何知道何时停止提取?

问题描述 投票:0回答:1

问题与标题相同,当对字符串使用提取运算符“>>”时

"   Hello   World"
有 3 个前导空白字符,在“Hello”之后也有空白,在“World”一词之后是字符串的结尾,所以我的问题是提取运算符如何知道它是否是前面的空白,非- 前面的空格以及它是否是字符串的结尾?

“字符串结尾”具体是如何表示的,我们如何在底层知道它?

读取操作符“std::basic_istream::operator>>”的 cppreference 时 显示如下:

由于这里的操作数是 basic_istream(我不确定),因此它对应于第 17 个描述,即“调用 func(*this),其中 func 是一个 I/O 操纵器”。这是什么意思 ?我该如何解释这个?

istringstream ss(s); 

string word;

while(ss>>word)
  {
   // do something
  }
c++ string input stream stringstream
1个回答
0
投票

其实并不复杂,基本算法在 cppreference 上有描述 https://en.cppreference.com/w/cpp/string/basic_string/operator_ltltgtgt

一个基本的实现(毫无疑问有很多错误和缺失的功能)看起来像这样:

#include <sstream>
#include <iostream>

std::istream& read(std::istream& is, std::string& str)
{
    while (std::isspace(is.peek()))
    {
        is.get();
    }
    str.erase();
    while (is)
    {
        auto c = is.peek();
        if (c == std::char_traits<char>::eof() || std::isspace(c))
        {
            break;
        }
        str.append(1, is.get());
    }
    return is;
}

int main()
{
    std::stringstream ss("   Hello   World");
    std::string word;
    while (read(ss, word))
    {
        std::cout << "'" << word << "'\n";
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.