2016-05-14 12 views
-3

次の問題があるので、私は2つの文字列を入力しようとしました。私は試しましたコンソールアプリケーションの1行にcin/getline

cin>> param1>>param2 

param1はnullにすることはできません。 param2がnullの場合は機能しません。

次へ私はgetline(cin,param1)getline(cin,param2) でこれを試しましたが、コンソールアプリケーションで2行にparamsを付ける必要があります。

コンソールparam1、param2から1行で読み込む必要があります。 私はこのプログラミング言語の初心者です。

おかげ

+0

は、なぜあなたは、あなたの質問のすべての単一の一つに「だから私は、次の問題を抱えている」と言うのですか?どのように質問に関連していますか? –

答えて

1

cinは、第2のパラメータを待つため、はい、それは、動作しません。 getline()を使用し、手動で文字列を解析する必要があります。 stringstream終了(CINが終わっていない)ので、一つだけparamは、渡された場合PARAM2が空になることを

string params, param1, param2; 
getline(cin, params); 
istringstream str(params); 
str >> param1 >> param2; 

注:

一つの可能​​性は、これを行うことです。

これは、 "parameter 1 with spaces" "parameter 2 with spaces" のような場合はまだ機能しません。なぜなら、istreamは単にスペースで分割して引用符を処理しないからです。

アプリケーションはパラメータを必要とするとき、通常、main()argcargv引数は(引用符でも動作します)アプリケーションのコマンドラインからそれらを取得するために使用されている

2

cinは、読み出しのためのものであるので、流れの方向が逆である:

cin >> param1 >> param2; 
+0

私は変更、申し訳ありません、私は急いでいた – lolex

1

cinstd::istreamのモデルです。どのistreamでもstream >> xの結果はistreamへの参照です。

istreamには、前の操作の成功または失敗を示すフラグがいくつか含まれています。

istreamboolに変換可能です。 boolの値は、前の操作が成功した場合はtrue、それ以外の場合は何らかの理由でfalseになります。

したがって、私たちが望むのであれば、>>操作だけでなく他のチェックも連鎖できます。

これは少し進んでいるかもしれませんが、面白いと思います。 このプログラムをそのままコンパイルして実行することができます。

#include <iostream> 
#include <string> 
#include <sstream> 
#include <iomanip> 


struct success_marker 
{ 
    success_marker(bool& b) 
    : _bool_to_mark(std::addressof(b)) 
    {} 

    void mark(bool value) const { 
     *_bool_to_mark = value; 
    } 
    bool* _bool_to_mark; 
}; 

std::istream& operator>>(std::istream& is, success_marker marker) 
{ 
    marker.mark(bool(is)); 
    return is; 
} 

success_marker mark_success(bool& b) { 
    return success_marker(b); 
} 

void test(const std::string& test_name, std::istream& input) 
{ 
    bool have_a = false, have_b = false; 
    std::string a, b; 

    input >> std::quoted(a) >> mark_success(have_a) >> std::quoted(b) >> mark_success(have_b); 

    std::cout << test_name << std::endl; 
    std::cout << std::string(test_name.length(), '=') << std::endl; 
    std::cout << have_a << " : " << a << std::endl; 
    std::cout << have_b << " : " << b << std::endl; 
    std::cout << std::endl; 
} 

int main() 
{ 
    std::istringstream input("\"we have an a but no b\""); 
    test("just a", input); 

    // reset any error state so the stream can be re-used 
    // for another test 
    input.clear(); 

    // put new data in the stream 
    input.str("\"the cat sat on\" \"the splendid mat\""); 
    // test again 
    test("both a and b", input); 

    return 0; 
} 

予想される出力:

just a 
====== 
1 : we have an a but no b 
0 : 

both a and b 
============ 
1 : the cat sat on 
1 : the splendid mat 
関連する問題