したがって、このプログラムの要件は、同じサイズ(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;
}
はすでにここに答えた:http://stackoverflow.com/questions/10828937/how-to-make-cin-take-only-numbers – Apara
は 'STDを使用してみてください:: getline'を使ってユーザの入力を大きな 'std :: string'として読み込み、' std :: string'が数字であることを確認し、 'std :: stoi'で変換して、これまでこれを行い、番号の範囲を確認し、承認はインバウンドです。 – user4581301
['std :: stoi'](http://en.cppreference.com/w/cpp/string/basic_string/stol)では' pos'パラメータを利用して 'stoi'が' string'全体を消費するようにしますそして、有効な数字の後ろに "asdfkla; j lasnfg jasklgn asfg"のようなハプニングがありません。 – user4581301