有没有办法在 C++ 中将输入字符串转换为输入流?

Is there a way to turn input string to input stream in c++?

我想做的是从终端获取用户输入并在我程序的其他功能中使用此输入。由于我的函数仅将输入流作为参数,因此我想将输入字符串转换为输入流。

int main(int argc, char** argv)
{

    std::vector<std::string> args(argv, argv + argc);
    
    if(args.size() == 1){ //if no arguments are passed in the console
        std::string from_console;
        std::istringstream is;
        std::vector<std::string> input;
        while(!getline(std::cin,from_console).eof()){
            input.emplace_back(from_console);
        }
        for(std::string str : input){
            std::cout << "\n" << str;
        }
}

我在尝试这段代码时出现的另一个问题是,当我以一堆字符结束控制台输入而不是换行(按 enter 然后按 ctrl+d)时,该行被忽略并且没有'不会打印出来。 例子: 当我输入以下内容时:

aaa bbb
ccc ctrl+d

我只打印了第一行 (aaa bbb) 而不是 ccc。 但是:

aaa bbb
ccc
ctrl+d 

也打印出 ccc,但它确实忽略了新行。那么为什么会这样呢?

Is there a way to turn input string to input stream in c++?

是的,这是可能的。这就是 std::istringstream 的用途。示例:

std::string input = some_input;
std::istringstream istream(input); // this is an input stream

当eof和最后一行内容在同一行时,getline(std::cin,from_console)会到达,.eof()会return为真,这样最后一行就读入了string from_console 但不推入矢量。

有两种方法:

  1. 通过手动将最后一行推入向量来修改您的代码:
while(!getline(std::cin,from_console).eof()){
    input.emplace_back(from_console);
}
input.emplace_back(from_console);  // add one line
for(std::string str : input){
  1. iterator 可以是一种优雅的方式:
#include <iterator>
// ...
if (args.size() == 1) {  // if no arguments are passed in the console
    copy(std::istream_iterator<std::string>(std::cin), {}, 
         std::ostream_iterator<std::string>(std::cout, "\n"));
}

std::istringstream class 有一个以 std::string 作为参数的构造函数,它使用传递的字符串的副本作为流的初始内容。

因此,与其使用 std::vector 来存储来自控制台的所有输入行,不如继续将它们添加到单个(不同的)std::string 对象中,记住在每个对象之后添加换行符,然后从中构建您的 std::istringstream

这是一个简单的例子,展示了如何在 std::cinstd::istringstream 像这样创建的对象:

#include <iostream>
#include <sstream>

int main()
{
    std::string buffer; // Create an empty buffer to start with
    std::string input;
    // Fill buffer with input ...
    do {
        getline(std::cin, input);
        buffer += input;
        buffer += '\n';
    } while (!input.empty()); // ... until we enter a blank line

    // Create stringstream from buffer ...
    std::istringstream iss{ buffer };

    // Feed input back:
    do {
        getline(iss, input);
        std::cout << input << "\n";
    } while (!input.empty());

    return 0;
}