Ваша конкретная проблема c:
Проблема, с которой вы сталкиваетесь, заключается в том, что при вводе числа, большего, чем может содержать целое число со знаком, cin
вводится в ошибку штат. Это означает, что последующие вызовы cin
не будут работать, пока вы не наберете cin.clear()
.
. Прочтите об этом здесь: http://www.cplusplus.com/reference/ios/ios/clear/
Чтобы исправить код, попробуйте добавив cin.clear()
после вызовов к cin
следующим образом:
#include <iostream>
#include <string>
using namespace std;
int main(int argc, const char * argv[]) {
int numOfNumbers;
int numbersAdded=0;
string input;
/* todo: use a vector<string> instead - which handles resizing and allocation for you */
string * arrayStrings;
if (!(cin >> numOfNumbers))
{
cout << "Warning: cin failed, did you enter a number larger than an numOfNumbers can hold? Value stored: " << numOfNumbers << endl;
/* todo: maybe stop execution here and report back? */
/* this will reset cin and leave numOfNumbers holding the largest value it can */
cin.clear();
}
arrayStrings = new string[numOfNumbers];
/* todo: check the allocation succeeded, otherwise stop and report the error */
while(numbersAdded<numOfNumbers){
if (!(cin >> input))
{
cout << "Warning: input failed, you entered a valid string? Value stored: " << input << endl;
/* this will reset cin and leave input holding the largest value it can */
cin.clear();
}
arrayStrings[numbersAdded]=input;
numbersAdded++;
}
for( int i = 0;i<numOfNumbers;i++){
cout<<arrayStrings[i]<<endl;
}
/* todo: this only deletes the array of pointers, not the strings themselves. Use a vector instead to avoid having to do memory management. */
delete arrayStrings;
return 0;
}
Запуск вышеуказанной программы даст следующий вывод при вводе большого числа:
99999999999999999999999999999
Предупреждение: cin не удалось, вы ввели число больше, чем может содержать numOfNumbers Сохраненное значение: 2147483647
Лучший подход:
Как указали другие в комментариях есть и другие вещи, которые нужно привести здесь в порядок, используя vectors et c. Вот альтернативная реализация, которая чище и имеет больше проверки:
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main(int argc, const char * argv[])
{
unsigned int numOfNumbers;
vector<string> numberStrings;
cout << "How many numbers would you like to enter?" << endl;
if (cin >> numOfNumbers)
{
unsigned int i;
/* input numbers from console */
cout << endl << "Please enter " << numOfNumbers << " numbers:" << endl;
for (i = 0; i < numOfNumbers; i++)
{
string input;
cin >> input;
numberStrings.push_back(input);
}
/* print numbers out */
cout << endl << "You entered:" << endl;
for (const auto& num: numberStrings)
{
cout << num << endl;
}
}
else
{
cout << "Number of numbers must be a positive integer less than " << UINT_MAX << endl;
}
return 0;
} /* vector magically deallocates when it leaves scope */