在cout之前没有从函数输出另一个字符串



为了刷新我生疏的c++知识,我创建了一个小程序。

然而,出现了一个小问题。我把一个突击队的输出输入到一个矢量中。然后我再次输出向量的内容。

如果我现在在向量内容的输出之前输出一些东西,那么有趣的是,向量的输出不再出现。为什么会这样?

#include <iostream>
#include <cstdio>
#include <memory>
#include <stdexcept>
#include <string>
#include <array>
#include <vector>
using namespace std;
const vector<string>& execv(const char* cmd);
void output(const vector<string>& vec);

int main() {
const vector<string>& result = execv("net user %USERNAME%");
int _numlines = result.size();
// if i uncomment the following line there's no output from 'output'
//cout << _numlines << " lines had been found: " << endl;
output(result);
return 0;
}
void output(const vector<string>& vec)
{
for(const string& line : vec)
cout << line;
}

const vector<string>& execv(const char* cmd)
{
array<char, 128> buffer;
vector<string> result;
//string result;
unique_ptr<FILE, decltype(&pclose)> pipe(_popen(cmd, "r"), _pclose);
if(!pipe)
{
throw runtime_error("_popen() failed!");
}
while (fgets(buffer.data(), buffer.size(), pipe.get()) != nullptr)
{
result.push_back(buffer.data());
}
const vector<string>& _res = result;
return _res;
}

就像其他人说的那样,不要返回对局部变量的引用。

在Coliru上直播

#include <array>
#include <cstdio>
#include <iostream>
#include <memory>
#include <stdexcept>
#include <string>
#include <vector>
using Strings = std::vector<std::string>;
Strings execv(std::string cmd);
void    output(const Strings& vec);
int main() {
auto result = execv("net user %USERNAME%");
std::cout << result.size() << " lines had been found: " << std::endl;
output(result);
}
void output(const std::vector<std::string>& vec)
{
for (auto& line : vec)
std::cout << line;
}
#include <stdexcept>
Strings execv(std::string cmd)
{
Strings result;
std::array<char, 128> buffer;
//string result;
std::unique_ptr<FILE, decltype(&pclose)> pipe(::popen(cmd.c_str(), "r"), ::pclose);
if (!pipe) {
throw std::runtime_error("popen() failed!");
}
while (fgets(buffer.data(), buffer.size(), pipe.get()) != nullptr)
{
result.push_back(buffer.data());
}
return result;
}

哪个在我的Linux机器上打印

Invalid command: net rap user %USERNAME%
4 lines had been found:
Usage:
net rap user add             Add specified user
net rap user info            List domain groups of specified user
net rap user delete          Remove specified user

最新更新