Помогите исправить ошибку в коде:
#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 введённое значение
// ну и так далее
Продвижение своими сайтами как стратегия роста и независимости