2016-05-01 12 views
0

作成するプログラムは、UNIX/Linuxシステムで現在ログインしているユーザー名を取得し、ウェルカムメッセージを表示します。コードブローが行っていることは、これだけを実行しています:C++でストリーム全体を出力できません

Welcome [email protected]:~/Dev/cpp$ 

残りのストリームは出力されません。残りの部分を出力できるようにするためには、私は何をする必要がありますか?この代わりに他の関数を使うべきですか?私はgetenv()を使うべきかどうか分からない。

正規表現などを使用してユーザー名だけを取得することもできますが、残りのストリームは出力されませんが、問題は解決しないものとします。

#include <iostream> 
#include <stdlib.h> 

int main() { 
    std::cout << "Welcome " << getenv("USERNAME") << " to APP_NAME. To get  available commands use --help" << std::endl; 
    return 0; 
} 
+0

「残りのストリームは出力されません」とはどういう意味ですか?それだけでうまくいく[ここ](http://coliru.stacked-crooked.com/a/68987d40b6e117bd)。 –

+3

この出力は混乱します。 'USERNAME'は標準環境変数ではありません。 'USER'は現在のユーザの名前を保持するはずですが、これはオプションです。私は 'getenv'があなたに' nullptr'を与えて、あなたが未定義の振る舞いをしているのではないかと疑っています。 'return'値を確認してください。 – 5gon12eder

+0

その 'USERNAME'環境変数は何を含んでいますか? – mpromonet

答えて

2

問題は、あなたが(私は驚かない)USERNAME変数が設定されていない環境でプログラムを実行していることです。したがってstd::getenvreturna nullptrにチェックを入れて、これをチェックしないと、std::coutになります。あなたの場合、ストリームが切り捨てられます。あなたが見ている[email protected]:~/Dev/cpp$はあなたのプログラムでは作成されませんが、プログラムが最終改行を出力せずに突然終了したため、通常のシェルプロンプトが面白い位置に終わります。

returnの値を使用する前にテストする必要があります。

#include <cstdlib> 
#include <iostream> 

int 
main() 
{ 
    if (const auto user = std::getenv("USERNAME")) 
    std::cout << "Hello, " << user << "\n"; 
    else 
    std::cout << "Hello, whoever you may be.\n"; 
} 

とにかく、これは現在ログインしているユーザーのユーザー名を取得する方法ではありません。信頼できない環境を使用する場合は、代わりにUSER変数を使用する必要があります。おそらくもっと頑強な解決策は、<unistd.h>によって提供されるPOSIXで指定されたgetlogin関数を使うことでしょう。 getloginも失敗する可能性があります(return a nullptr)ので、バックアップ戦略が必要です。

1

唯一の原因は、あなたがあなたのプログラムを実行する際に、環境変数USERNAMEが存在しないということです。 getenv関数はnullptr(@ 5gon12ederの示唆)を返し、出力ストリームにnullptrを注入して未定義のビヘイビアを呼び出します。あなたの例では、SIGSEGVを発生させた場合、出力を終了します(文字列にnullを挿入した場合のように)。

あなたは環境変数が存在することを確認する必要があります

int main() { 
    const char *name = getenv("USERNAME"); 
    if (name == std::nullptr) { name = "unknown guest"; } 
    std::cout << "Welcome " << name << " to APP_NAME. To get  available commands use --help" << std::endl; 
    return 0; 
} 
関連する問題