Пропускает ввод данных

311
19 декабря 2016, 19:53

Помогите исправить ошибку в коде:

    #pragma hdrstop
#pragma argsused
#include <tchar.h>
#include <stdio.h>
#include <iostream>
#include <windows.h>
using namespace std;
int _tmain(int argc, _TCHAR* argv[]) {
    int mass_width, mass_height; // длина строки, и количество
    int string_length;
    // SetConsoleCP(1252); // Для корректного отображения русс.яз.
    SetConsoleOutputCP(1251); // Для корректного отображения русс.яз.
    string_length = 0;
    // -------------------------------------------------------------------------
    cout << "Количество строк в массиве: ";
    cin >> mass_height;
    cout << "Максимальная длина строки: ";
    cin >> mass_width;
    // -------------------------------------------------------------------------
    char **ptrarray = new char* [mass_height]; // столбцы в массиве
    for (int count = 0; count < mass_height; count++)
        ptrarray[count] = new char[mass_width]; // строки
    // -------------------------------------------------------------------------
    for (int count = 0; count <= mass_height; count++) {
        printf("Введите строку № %d: ", count);
        fgets(ptrarray[count], mass_width, stdin);
        int length = strlen(ptrarray[count]);
        if (length > 0 && ptrarray[count][length - 1] == '\n')
            ptrarray[count][length - 1] = '\0';
        if (length > string_length) {
            string_length = length;
        }
    }
    // -------------------------------------------------------------------------
    cout << "Максимальная длинна строки = " << string_length - 1;
    // -1 из-за терминирующего нуля
    // -------------------------------------------------------------------------
    getchar();
    return 0;
}

Результат программы:

Количество строк в массиве: 10
Максимальная длина строки: 99
Введите строку № 0: Введите строку № 1:

Как видите, не получается ввести данные в строку №0. Где я ошибся?

Answer 1

у тебя количество строк - mass_height; ты создаёшь mass_height строк, но пытаешься прочитать mass_height строк, так как у тебя цикл for (int count = 0; count <= mass_height; count++) вместо for (int count = 0; count < mass_height; count++). Ещё тебе нужно после cin >> mass_width; добавить cin.get(); Вместо fgets(ptrarray[count], mass_width, stdin); использовать cin.getline(ptrarray[count], mass_width); и тогда можно избавиться от первого if'а и выводя длину самой длинной строки не нужно будет отнимать единичку.у меня почему-то не работает setConsoleOutputCP. вот код.

#pragma hdrstop
#pragma argsused
#include <tchar.h>
#include <stdio.h>
#include <iostream>
#include <windows.h>
using namespace std;
int _tmain(int argc, _TCHAR* argv[]) {
    int mass_width, mass_height; // длина строки, и количество
    int string_length;
    //SetConsoleCP(1252); // Для корректного отображения русс.яз.
    SetConsoleOutputCP(1251); // Для корректного отображения русс.яз.
    string_length = 0;
    // -------------------------------------------------------------------------
    cout << "kolichestvo strok v massive: ";
    cin >> mass_height;
    cout << "maksimalnaya dlina stroki: ";
    cin >> mass_width;
    cin.get();
    // -------------------------------------------------------------------------
    char **ptrarray = new char* [mass_height]; // столбцы в массиве
    for (int count = 0; count < mass_height; count++)
        ptrarray[count] = new char[mass_width]; // строки
    // -------------------------------------------------------------------------
    for (int count = 0; count < mass_height; count++) {
        cout << "Vvedite strolu nomver " << count << ": ";
        cin.getline(ptrarray[count], mass_width);
        int length = strlen(ptrarray[count]);
        if (length > string_length) {
            string_length = length;
        }
    }
    // -------------------------------------------------------------------------
    cout << "maksimalnaya dlina stroli = " << string_length;
    // -1 из-за терминирующего нуля
    // -------------------------------------------------------------------------
    cin.get();
    return 0;
}
Answer 2

Проблема в том, что после прочтения второго числа (mass_width) во входном потоке остаётся символ перевода строки ('\n'), который и читается в строку №0. Перед чтением массива char'ов следует очистить stdin функцией fflush(stdin).

P.S. Ваш учитель редкостный чудак, мешать чтение с помощью потоков (C++ style) и stdin (C style) - редкостное убожество. Заставлять при этом пользоваться массивами char'ов вместо строк - вообще садизм.

Answer 3

Думаю, проблема вот в чём. Вы не должны вводить числа через cin. А ещё, вы не проверяете, как отработал cin << — успешно или нет.

Смотрите, что у вас во входном потоке: 10, \n, 99, \n и т д.

Строка cin >> mass_height; считывает из потока 10. Следующий ввод cin >> mass_width; натыкается на \n и завершается с ошибкой. В состоянии ошибки остальной ввод тоже не работает.

Вам надо вводить данные через getline в строку (ради всего святого, не пользуйтесь char[] в качестве строки, иначе проблемы будете разгребать до конца года), и вытаскивать из неё число (например, при помощи stringstream).

Если вам необходимо пользоваться char[] для строк, к вашим услугам соответственно cin.getline().

// вспомогательная функция
bool stoa(char* s, int& out)
{
    istringstream iss(s);
    return !!(iss >> out);
}
char inputBuffer[256];
cin.getline(inputBuffer, 256);
if (!stoa(inputBuffer, mass_height))
{
    cout << "wtf?" << endl;
    return 1;
}
// тут у mass_height введённое значение
// ну и так далее
READ ALSO
Разбор заголовка пакета(C++, sockets)

Разбор заголовка пакета(C++, sockets)

Есть генератор UDP пакетов и снифферКогда сниффер ловит нужный пакет , сохраняю его содержимое в файл

237
Illegal zero-sized array

Illegal zero-sized array

Здравствуйте, есть такой класс:

218
C++ С чего начать?

C++ С чего начать?

С чего начать изучение C++? Мне 14 летМатематику знаю хорошо

310
Не получается использовать *.qrc

Не получается использовать *.qrc

В проекте есть *qrc файл, в нём есть много ресурсов, Qt-шные классы легко получают ресурсы из *

240