2017-09-24 12 views
-4

以下は私のコードです(C++)...私はgetusernameで取得したユーザー名をメイン関数に戻す方法を混乱させています。誰もがナイスのヒントや提案を持っていますか?文字列をmain 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を使用していますが、エラーは返されませんでした...出力はユーザー名を返すことはありません...ちょうど 'Hello:'と言います。 – 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の値を入力させる場合は、2つのオプションがあります。あなたがuserの値は空白なしにしたい場合は、使用することができます。

std::cout >> user; 

をあなたはuserの値は、テキスト、空白とすべて、使用の行全体を含むようにしたい場合:

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

環境変数USERNAMEの値を取得するには、std::getenvを使用します。それがある場合

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

を使用してユーザ名を取得します。 – NerdOfCode

+2

@NerdOfCodeあなたが達成したいことはまったく不明です。 – user0042

+0

@NerdOfCode、 'std :: getline'は標準ライブラリ関数です。あなたはそれを実装する必要はありません。あなたはそれを使うだけです。 –

2

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

戻りの値は

コマンドがヌルポインタである場合は、関数は、コマンドプロセッサが利用可能である場合にゼロ以外の値とゼロ値を返しますない。

commandがNULLポインタでない場合、返される値はシステムとライブラリの実装によって異なりますが、一般に、呼び出されたコマンドが返すステータスコードがサポートされていると想定されます。

システムコマンドを実行して出力をキャッチする場合は、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あなたのリンクでは、最終的な例では、writteがわずかに異なっていても、私のコードと同じアイデアを使用しています。 .get()がEOFを出しているかどうかを確認し、結果に追加する前に読み込んだデータを確認します。私は問題を見ない? – super

+1

@super同じ考え方は、while(fgets(buffer.data()、128、pipe.get())!= nullptr) ' –

0

すでにアウトポインタしている、のstd ::システムコールを使用して、シェルに/から/書き込みを読んでいないことができることを意味し、インタラクティブではありません。

私は、ユーザーがシェルと簡単にやり取りできるようにする、Posix準拠のオペレーティングシステム用の素晴らしいpopen()ラッパーを実装しました。あなたはそれを確認することができます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 
} 

このライブラリは、複数のこのようなラッパーが含まれており、彼らはあなたのニーズに合わせた場合、それらを使用することを歓迎以上です。

関連する問題