将函数中的 cout 存储为字符串

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

我有一个函数,它接受整数向量并通过

std::cout
输出它们。

#include <iostream>
#include <vector>

void final_sol(std::vector<int> list){
    for (int i ; i < list.size() ; i++){
        std::cout << list[i] << " ";
    }
}

int main(){
    std::vector<int> list = {1, 2, 3, 4, 5};
    final_sol(list);
    return 0;
}

但是,从这一点开始,我希望有一种方法可以快速获取

final_sol(vector)
的输出作为字符串。一种方法是修改原始函数以创建字符串。不过,我对修改
final_sol(vector)
不感兴趣。还有另一种方法可以将输出存储为字符串吗?

c++ string vector
2个回答
3
投票

提供过载:

void final_sol(std::ostream& out, const std::vector<int>& list){
    for (int i = 0; i < list.size() ; i++){
        out << list[i] << " ";
    }
}

void final_sol(const std::vector<int>& list){
    final_sol(std::cout, list);
}

这样您现有的调用代码将不会受到影响 - 这很可能就是您想要的:不修改函数签名。不是你所描述的那样:不要修改 Final_sol 的实现。

然后你可以这样做:

std::ostringstream str;
final_sol(str, list);
auto s = str.str()

0
投票

由于您“对修改

final_sol(vector)
不感兴趣”,这意味着您被困于
final_sol()
写入
std::cout
,在这种情况下,您的唯一选项是更改
std::cout
将其数据输出到的位置。您可以使用其
rdbuf()
方法来实现此目的,例如:

#include <iostream>
#include <sstream>
#include <vector>

void final_sol(const std::vector<int> &list){
    for (size_t i = 0; i < list.size(); ++i){
        std::cout << list[i] << " ";
    }
}

int main(){
    std::vector<int> list = {1, 2, 3, 4, 5};

    // save pointer to std::cout buffer
    auto cout_buff = std::cout.rdbuf();
 
    // substitute std::cout buffer with 'local' buffer
    std::ostringstream local;
    std::cout.rdbuf(local.rdbuf());
 
    // now std::cout works with the 'local' buffer
    // so you won't see any console output here
    final_sol(list);
 
    // go back to the old buffer
    std::cout.rdbuf(cout_buff);
  
    // use the local buffer as needed ...
    std::cout << local.str();

    return 0;
}

但是,正确的解决方案是:

  1. final_sol()
    返回一个
    std::string
    ,然后调用者可以决定如何处理它,例如:

    #include <iostream>
    #include <vector>
    #include <string>
    
    std::string final_sol(const std::vector<int> &list){
        std::string s;
        for (size_t i = 0; i < list.size(); ++i){
            s += (std::to_string(list[i]) + " ");
        }
        return s;
    }
    
    int main(){
        std::vector<int> list = {1, 2, 3, 4, 5};
        std::string s = final_sol(list);
        // use s as needed...
        std::cout << s;
        return 0;
    }
    
  2. final_sol()
    接受
    std::ostream&
    参数,以便调用者可以决定将输出写入何处,例如
    std::ostringstream
    ,例如:

    #include <iostream>
    #include <sstring>
    #include <vector>
    
    void final_sol(const std::vector<int> &list, std::ostream &out){
        for (size_t i = 0; i < list.size(); ++i){
            out << list[i] << " ";
        }
    }
    
    int main(){
        std::vector<int> list = {1, 2, 3, 4, 5};
        std::ostringstream oss;
        final_sol(list, oss);
        // use oss.str() as needed...
        std::cout << oss.str();
        return 0;
    }
    
© www.soinside.com 2019 - 2024. All rights reserved.