Помогите исправить ошибку в коде:
#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. Где я ошибся?
у тебя количество строк - 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;
}
Проблема в том, что после прочтения второго числа (mass_width
) во входном потоке остаётся символ перевода строки ('\n'
), который и читается в строку №0. Перед чтением массива char
'ов следует очистить stdin
функцией fflush(stdin)
.
P.S. Ваш учитель редкостный чудак, мешать чтение с помощью потоков (C++ style) и stdin (C style) - редкостное убожество. Заставлять при этом пользоваться массивами char
'ов вместо строк - вообще садизм.
Думаю, проблема вот в чём. Вы не должны вводить числа через 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 введённое значение
// ну и так далее
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Есть генератор UDP пакетов и снифферКогда сниффер ловит нужный пакет , сохраняю его содержимое в файл
В проекте есть *qrc файл, в нём есть много ресурсов, Qt-шные классы легко получают ресурсы из *