2017-01-26 33 views
-1

したがって、このプログラムの要件は、同じサイズ(5から15までのインデックス)の配列をインクリメントし、forループとwhileループを使用して配列の各要素を1つずつインクリメントすることです。最後のタスクは、最初の配列から値を取り出し、それらを逆の順序で入れて、2番目の配列に割り当てます。ユーザー入力から数字だけを受け入れるにはどうすればよいですか?

したがって、すべて正常に動作し、プログラムは無効な入力を拒否し、無限ループに入りません。しかし、このプログラムは、望ましくない入力を受け入れます。

たとえば、I would input something like '12 a'または '7 asdfkla; j lasnfg jasklgn asfg'と入力します。コードは12または7のみを登録し、残りは完全に無視するので、面白いです。私は一度それが非整数文字をヒットすると、それは残りの部分を無視して停止するためだと思う。

残りの入力を無視するのはなぜですか?そして、このエラーを処理する方法はありますか?

また、あなたの目を引っ張るものがあれば、自由に批評してください。私は常に改善を目指しています。

#include <iostream> 
#include <cstdlib> 
#include <ctime> 
using namespace std; 

int main() { 
    srand(time(NULL)); 
    int x; 
    int j = 0; 
    bool not_valid = true; 

    system("color f"); 

    cout << "Program will ask for an input for the size of an array.\n" 
     << "With the array size defined, program will generate semi-\n" 
     << "true random integers from 0 to 8. First array will then\n" 
     << "be assigned to the second in reverse (descending) order.\n\n"; 

    do { 
     cout << "Enter array size (0 - 15): "; 
     cin >> x; 

     if (x >= 5 && x <= 15) { 
      not_valid = false; 
      cout << "\nArray size: " << x << endl; 
     } 
     else { 
      cout << "Invalid input.\n\n"; 
      cin.clear(); 
      cin.ignore(numeric_limits<streamsize>::max(), '\n'); 
     } 

    } while (not_valid); 

    int *arr0; 
    int *arr1; 
    arr0 = new int[x]; 
    arr1 = new int[x]; 

    for (int i = 0; i < x; i++) { 
     arr0[i] = rand() % 9; 
    } 

    for (int i = 0; i < x; i++) { 
     arr1[i] = rand() % 9; 
    } 

    cout << "\nARRAY 0 (unmodified, for):\n"; 
    for (int i = 0; i < x; i++) { 
     cout << arr0[i] << "\t"; 
    } 

    cout << "\n\nARRAY 0 (modified, for):\n"; 
    for (int i = 0; i < x; i++) { 
     arr0[i]++; 
     cout << arr0[i] << "\t"; 
    } 

    cout << "\n\nARRAY 1 (unmodified, while):\n"; 
    for (int i = 0; i < x; i++) { 
     cout << arr1[i] << "\t"; 
    } 

    cout << "\n\nARRAY 1 (modified, while):\n"; 
    while (j < x) { 
     arr1[j]++; 
     cout << arr1[j] << "\t"; 
     j++; 
    } 

    int second = x - 1; 

    for (int i = 0; i < x; i++) { 
     arr1[second] = arr0[i]; 
     second--; 
    } 

    j = 0; 
    cout << "\n\nARRAY 1 (array 0, descending):\n"; 
    while (j < x) { 
     cout << arr1[j] << "\t"; 
     j++; 
    } 

    cout << endl << endl; 
    system("pause"); 
    return 0; 
} 
+0

はすでにここに答えた:http://stackoverflow.com/questions/10828937/how-to-make-cin-take-only-numbers – Apara

+0

は 'STDを使用してみてください:: getline'を使ってユーザの入力を大きな 'std :: string'として読み込み、' std :: string'が数字であることを確認し、 'std :: stoi'で変換して、これまでこれを行い、番号の範囲を確認し、承認はインバウンドです。 – user4581301

+0

['std :: stoi'](http://en.cppreference.com/w/cpp/string/basic_string/stol)では' pos'パラメータを利用して 'stoi'が' string'全体を消費するようにしますそして、有効な数字の後ろに "asdfkla; j lasnfg jasklgn asfg"のようなハプニングがありません。 – user4581301

答えて

0

文字列で入力を取り、それが数かないかどうかを確認します。

例:

#include<iostream> 
#include<sstream> 
#include <string> 
using namespace std; 

int main() 
{ 
    string line; 
    int n; 
    bool flag=true; 
    do 
    { 
     cout << "Input: "; 
     getline(cin, line); 
     stringstream ss(line); 
     if (ss >> n) 
     { 
      if (ss.eof()) 
      { 
       flag = false; 
      } 
      else 
      { 
       cout << "Invalid Input." << endl; 
      } 
     } 
    }while (flag); 
    cout << "Yo did it !"; 
} 
関連する問題