C ++ вставлять цифры до определенного символа - PullRequest
1 голос
/ 28 сентября 2011

Я пытался написать код, который попросил бы меня вводить числа один за другим, и когда был вставлен определенный символ (в данном случае 'x'), он остановил бы цикл.Но когда я вставляю этот символ, он начинает спамить меня "Вставить номер".Я думаю, что ошибка в том, что я пытаюсь вставить символ в массив int, но я не могу обойти это.

long int numbers[100]={0};
char h='y';
int index=0;
do
{
    cout << "Insert Number : ";
    cin >> numbers[index];
    h=(char)numbers[index];
    index++;
}
while(h!='x');

Ответы [ 4 ]

2 голосов
/ 28 сентября 2011

Это происходит потому, что 'x' не является числом и операция cin >> numbers[index]; завершается неудачно, без использования этих данных.Таким образом, цикл продолжается, получает тот же x, снова выходит из строя и все начинается заново.Вы можете проверить результат операции ввода, примерно так:

#include <iostream>

using namespace std;

int main ()
{
    long int numbers[100]={0};
    char h='y';
    int index=0;
    do
    {
        cout << "Insert Number : ";
        if (cin >> numbers[index])
        {
            h=(char)numbers[index];
            index++;
        }
        else
        {
            cout << "Hey, that was not a number! Bye." << endl;
            break;
        }
    }
    while(h!='x');
}
0 голосов
/ 28 сентября 2011

Если вы ожидаете число или строку, всегда читайте ввод как строку и попробуйте затем преобразовать его в число, если строка не «x»:

#include <vector>
#include <string>
#include <sstream>
#include <iostream>    

int main(int argc, char *argv[])
{
    std::vector<long int> numbers;
    std::string line;
    while(std::getline(std::cin, line) && line != "x") {
        std::istringstream input(line);
        long int value; 
        // Check that there is only a number with nothing else after
        if((input >> value) && input.get() == std::char_traits<char>::eof()) {
            numbers.push_back(value);
        } else {
            std::cout << "Invalid Entry, please retry" << std::endl;
        }
    }

    //...

    return 0;
}
0 голосов
/ 28 сентября 2011

Поскольку вы пытаетесь прочитать целое число, любой символ, который не является цифрой, не может быть преобразован в число и приведет к засорению ввода - вы получите ошибку, а плохой символ не будетснято с потока.В следующий раз, когда вы попытаетесь прочитать, вы получите ту же ошибку.

0 голосов
/ 28 сентября 2011

Вы должны написать цикл следующим образом:

while(cin >> numbers[index]) 
   index++;

Он будет читать все целые числа, пока вы не введете неправильный ввод, будь то 'x' или любой другой символ.Теперь, если вы хотите пропустить все недопустимые входные данные и продолжить чтение целых чисел (которые могут быть после недопустимых входных данных) и хотите рассмотреть только 'x' для выхода из цикла, то оберните вышеуказанный цикл другим циклом в виде:

char ch;
do
{
   while(cin >> numbers[index]) 
       index++;
   cin.clear(); //clear the error flags, so you can use cin to continue reading
   cin >> ch; //read the invalid character
} while(ch != 'x');

Один совет: предпочитайте использовать std::vector<long int> вместо long int numbers[100].Что, если пользователь ввел более 100 целых чисел, то ваша программа будет повреждена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...