2016-08-14 2 views
0

私はスペースで区切られたポジティブダブルのセットを入力として期待し、それをプリントアウトするC++プログラムを持っています。 cinでスペースで区切られた入力を確認する方法を厳密に倍増させるには?

が、私は最初の数が適切に印刷された、カンマ+空白の(誤って)」で区​​切られた3つの値を入力し、他はありませんでした。各値が正しいかどうかをチェックし、間違った値をすべて一覧表示するにはどうすればよいですか?

cout << "Enter three positive numbers separated by spaces" << endl; 
double a = 0, b = 0, c = 0; 
cin >> a >> b >> c; 
cout << a << ' ' << b << ' ' << c << endl; 

入力:1 2 3出力:1 2 3

入力:1、2、3出力:第2のケースで1 0 0

、Iを検出しますエラーがあり、有効なダブルワードでない用語がリストされています。

エラーメッセージ:1番目、2番目、3番目は有効な倍数ではありません。コードの下の回答に基づいて(それはまだ最初の扱い:私は無効な値をチェックする場合は、1

アップデートを受け入れるように見えるので、

(0)私は、2及び3ではなく1をキャッチします)として正しい最初にも間違っているべきであるが、上記の入力が間違っているような第二:

+0

"更新:コードは以下の回答に基づいています"これを行う場合は、回答者に通知しているコメントを残してください。その作者はこのスレッドを爽やかに座っていることはまずありません。そうでなければ、質問のインデックスを正確なタイミングで再表示しなければ、OPを編集したことに気付かないでしょう。 –

+0

プログラムに「ダブルス」を入力することはできません。 'double'データ型で表すことができる_numbers_のみを入力できます。私はニッピピングではない:あなたは表現と意味の違いを理解し、理解しなければならない。そして表現の異なるカテゴリー間の違い。 –

答えて

1
cout << "Enter three numbers separated by spaces" << endl; 
    double a = 0, b = 0, c = 0; 
    if(cin >> a) 
    { 
    cout << "first number was correct" << endl; 
    if(cin >> b) 
    { 
     cout << "second number was correct" << endl; 
     if(cin >> c) 
     { 
     cout << "third number was correct" << endl; 
     cout << a << " " << b << " " << c << endl; 
     } 
     else 
     { 
     cout << "third number was wrong" << endl; 
     } 
    } 
    else 
    { 
     cout << "second number was wrong" << endl; 
    } 
    } 
    else 
    { 
    cout << "first number was wrong" << endl; 
    } 

何か操作が失敗したかどうかを確認するためにcinの状態をテストすることができます。 cin.good()が真であれば、それまでのところすべて問題ありません。

入力全体をテストする最も簡単な方法は、ちょうどあなたがよりきめの細かい結果をしたい場合は、一度に一つの変数を読みたいかもしれないif文

if (cin >> a >> b >> c) 
    cout << "fine"; 
else 
    cout << "something went wrong"; 

にそれを置くことです各読み取り間の状態を確認してください。

+0

このように "1 1 1f"は "fine"と表示されます – FrozenHeart

+0

ありがとうございます。私はこのアプローチに基づいて質問を更新しました。最初の '1'は上の@FrozenHeartのコメントに似ていますが、私の例ではうまくいきません。 – Anand

-2
#include <iostream> 
#include <sstream> 
#include <vector> 

using namespace std; 

template<typename T> 
bool validatedCoercion(string input, T &dest) { 
    istringstream iss(input); 
    if(!(iss >> dest)) return false; 
    return iss.rdbuf()->in_avail() == 0; 
} 

vector<string> splitByCommaOrSpace(const string& input) { 
    vector<string> result; 
    string buffer; 
    bool ok = true; 
    for(char c : input) { 
     if((c == ',' || isspace(c)) && buffer.size() != 0) { 
      result.push_back(buffer); 
      buffer = ""; 
     } else { 
      buffer += c; 
     } 
    } 
    if(buffer.size() != 0) { 
     result.push_back(buffer); 
    } 
    return result; 
} 


int main() 
{ 
    const int N = 3; 
    double x[N] = {-1}; 

    string line; 
    getline(cin, line); 
    if(!cin) { 
     cerr << "An error occured while reading from stdin." << endl; 
    } 

    auto doubles = splitByCommaOrSpace(line); 
    if(doubles.size() != N) { 
     cerr << "Invalid number of input, expected " << N << " got " << doubles.size() << endl; 
    } 

    int i = 1; 
    for(string& s : doubles) { 
     if(!validatedCoercion(s, x[i-1])) { 
      cout << "column " << i << " is not a valid number.\n"; 
     } 
     i++; 
    } 

    i = 1; 
    for(double d : x) { 
     if(x > 0) { 
      cout << "number " << i << " is positive.\n"; 
     } else { 
      cout << "number " << i << " is invalid (not strictly positive).\n"; 
     } 
     i++; 
    } 

    i = 1; 
    for(double d : x) { 
     cout << "number " << i++ << " is " << x[i-1] << "\n"; 
    } 
    return 0; 
} 

例1:

12.32, 43,2 
number was 1 correct. 
number was 2 correct. 
number was 3 correct. 
number 1 is 12.32 
number 2 is 43 
number 3 is 2 

例2:

1.3 23 4 
number was 1 correct. 
number was 2 correct. 
number was 3 correct. 
number 1 is 1.3 
number 2 is 23 
number 3 is 4 

例3:

1 2d 3sd 
number was 1 correct. 
number was 2 wrong. 
number was 3 wrong. 
number 1 is 1 
number 2 is 2 
number 3 is 3 

例5:

a b 
Invalid number of input, expected 3 got 2 
number was 1 wrong. 
number was 2 wrong. 
number 1 is 0 
number 2 is 0 
number 3 is 0 

例6(更新されたコード):

1 -2 a 
column 3 is not a valid number. 
number 1 is positive. 
number 2 is positive. 
number 3 is positive. 
number 1 is 1 
number 2 is -2 
number 3 is 0 

は、私はあなたがこれで長い道を行くことができると思います。

+0

このように "12gh"は "number was correct"と表示されます – FrozenHeart

+0

@FrozenHeart編集済み(compltetly re-wrote) – fstamour

+0

質問の2番目の入力で正しい答えが実行されます - 入力が3つではないときにエラーになります二重の数字。 – Anand

1

私はあなたがブーストを使用することをお勧めします。

std::string input; 
std::getline(std::cin, input); 
std::vector<std::string> numbers; 
split(numbers, input, is_any_of(" \t"), token_compress_on); 
for (const std::string& number : numbers) 
{ 
    try 
    { 
    double value = boost::lexical_cast<double>(number); 
    std::cout << number << " is a number" << std::endl; 
    } 
    catch (const boost::lexical_cast&) 
    { 
    std::cout << number << " is not a number" << std::endl; 
    } 
} 
+0

ありがとう、ありがとう、ブーストなしでそれを行う方法はありますか? – Anand

+0

@Anandもちろん、あなたはホイールを再実装します – FrozenHeart

関連する問題