2017-09-24 28 views
-4

下面是我的代码(C++)以下...我很困惑如何将我在getusername中检索到的用户名返回到主函数。有没有人有没有提示或建议?如何将字符串返回到主int函数?

#include <iostream> 
//For the strings obviously 
#include <string> 
using namespace std; 

string getusername(); 
string user; 


string getusername() { 
    user = system("echo %username% > NUL"); 
    return user; 
} 



int main() { 
    string getname; 
    getname = getusername(); 
    cout << "Hello: "<< getname << endl; 
} 
+0

我正在使用Visual Studio,它没有返回任何错误...输出永远不会返回用户名,尽管...它只是说'你好:'并且省去了用户名。 – NerdOfCode

+0

您应该阅读关于['std :: system()'](http://en.cppreference.com/w/cpp/utility/program/system)函数实际上的功能 – user0042

+1

您是否想要获取环境变量'%username%'?检查['std :: getenv()'](http://en.cppreference。com/w/cpp/utility/program/getenv)。 – user0042

回答

2

return声明应该工作。但是,

user = system("echo %username% > NUL"); 

是一个问题。请参阅documentation of std::system以了解其功能。

如果您希望用户输入值usre,您有两种选择。如果你想的user值是没有空格,你可以使用:

std::cout >> user; 

如果你想的user价值包含文本,空白的整条生产线和所有,用途:

std::getline(std:::cout, user); 

如果要使用获取环境变量USERNAME的值,请使用std::getenv

user = std::getenv("USERNAME"); 
+0

我究竟在哪里实现'getline'? – NerdOfCode

+2

@NerdOfCode完全不清楚你想达到什么目的。 – user0042

+0

@NerdOfCode,'std :: getline'是一个标准的库函数。你不需要实现它。你只是用它。 –

2

http://www.cplusplus.com/reference/cstdlib/system/

返回值

如果命令是一个空指针,如果是该函数返回一个非零值的情况下,命令处理器是可用的和零值不。

如果command不是空指针,则返回的值取决于系统和库实现,但通常期望它是由被调用的命令返回的状态代码(如果支持)。

如果您想要运行系统命令并捕获输出,您可以使用popen。

一个简单的例子可能看起来像这样。

std::string exec(const std::string& cmd) { 
    std::array<char, 128> buffer; 
    std::string result; 
    std::shared_ptr<FILE> pipe(popen(cmd.c_str(), "r"), pclose); 
    if (!pipe) throw std::runtime_error("popen() failed!"); 
    while (fgets(buffer.data(), 128, pipe.get()) != nullptr) 
     result += buffer.data(); 
    return result; 
} 
+1

请不要参考有问题和不可靠的参考。 en.cppreference.com比这更好。 – user0042

+0

@ user4581301在你的链接中,最后一个例子使用与我的代码相同的想法,即使写法略有不同。检查.get()是否给出EOF,然后在将其附加到结果之前验证读取的数据。我没有看到问题? – super

+1

@super同样的概念是'while(fgets(buffer.data(),128,pipe.get())!= nullptr)' –

0

正如其他人已经指针移出,在std ::系统调用是不是交互式的,这意味着你不能从/到外壳读/写。

我已经为Posix兼容的操作系统实现了一个很好的popen()包装,允许用户轻松地与shell进行交互,你可以检查出here

下面是一个使用示例:

try { 
    mp::ipstream reader("ls -l"); 

    vector<string> output; 
    reader >> output; 
} 
catch (std::runtime_error & ex) { 
    // Something went wrong and ex.what() will tell you what it is 
} 

这个库包含更多这样的包装和你比欢迎,如果他们满足您的使用需要他们。