Как мне удалить / игнорировать символы после определенного числа в getline? - PullRequest
0 голосов
/ 06 октября 2018

Я пробую динамическое распределение памяти.Я хочу динамически распределять память, достаточно для строки из 10 символов.Если пользователь вводит более 10 символов, я хочу, чтобы в getline было извлечено только 10 символов (плюс символ новой строки, я полагаю), а затем они были сохранены в динамической памяти правильного размера, напечатаны и удалены.Ниже мой код:

#include <iostream>
using namespace std;

int main() {
char cont = 'N';

do{
    char *input = new char[11];
    cout << "This program dynamically allocates memory for a string of 
    characters up to 10 in length\n";
    cout << "Enter a string less than or equal to 10 characters:\n";
    cin.getline(input, 11, '\n');

    cout << "Your string is:\n";
    cout << input << endl << endl;
    delete input;

    cout << "Would you like to enter another? \"Y\" to continue\n";
    cin >> cont;
    cin.ignore();

} while (toupper(cont) == 'Y');

Все отлично работает, если пользователь вводит до 10 символов.Это может повториться навсегда.

Однако, если пользователь вводит более 10 символов, программа не предлагает пользователю продолжить и вместо этого просто завершает работу.ABCDEFGHIJ работает, но ABCDEFGHIJK ломается.

Я подумал, что это потому, что в cin все еще есть что-то, что читается на входе, и это не «Y», и поэтому программа завершается.Однако, если вы пройдете один цикл и сначала установите cont в 'Y', а затем введете ABCDEFGHIJK, программа станет бесконечной, не вводя ничего для перезаписи 'Y'.

Еще одна вещь, которую я заметил, это getline, кажется, тянетправильное количество символов, в которых хранятся символы ABCDEFGHIJ на входе, даже если был введен ABCDEFGHIJK. Я подумал, что, возможно, «K» оставлено в cin, поэтому я попытался ABCDEFGHIJY, но «Y» не был сохранен в продолжение.

Я также пробовал различные варианты cin.clear () перед следующим запросом ввода, но ничего не получалось.

Мне кажется, я неправильно понимаю, как getline работает с перегрузкой, которую я использую.

1 Ответ

0 голосов
/ 07 октября 2018

Сначала позвольте мне сказать вам, что сделать это со строкой намного проще, но если вы хотите сделать это сложным, распределяющим способом ...


Проблема:

Когда вы читаете с std::cin, и некоторые условия не выполняются, например, чтение строки в виде целого числа или исчерпание заданных символов, бит сбоя устанавливается.Это заставляет ваш istream выглядеть сумасшедшим

Исправлено:

Поставьте проверку после вызова getline, проверьте, установлен ли бит сбоя, если он установлен, сбросьте флаги.

/* ... */

cin.getline(input, 11, '\n'); // Read input

if ( cin.fail() ) { // Check if getline failed
    // -- > Remind the user of the limits here < --

    // Clear flags
    cin.clear();
    cin.ignore();
}

/* ... */

Ваш вариант getline имеет аргументы: char_type * Output, std::streampos MaxLength, char_type Delimeter.Устанавливает бит сбоя, если число считываемых байтов больше максимальной длины (AFAIK) .

Источники:

Желаю удачи в динамических распределениях, COlda ​​

...