2016-01-23 3 views
1

Я пишу программу, в которой я все время получаю сообщение об ошибке. Эта программа считывает данные из двух файлов txt и распечатывает их после их сортировки. У меня есть проблема, когда я пытаюсь использовать указатель на указатель, чтобы прочитать массив символов следующим образом:Ошибка: не может преобразовать char (*) [] в char ** 'при инициализации

int c; 
cin >> c; 

char** commands = new char[c][256]; //first array read one complete line, and the second one read the array(data) of the lines 

for(int i = 0; i <= c - 1; i++){ 
    cin >> commands[i];} 

Может кто-нибудь пожалуйста, скажите мне, где я делаю неправильно? Любая помощь приветствуется.

+0

Объявление 'команд' должно быть' char (* commands) [256] = ... '. это указатель на строку из 256 символов. У вас есть 'c' этих строк. Увеличение этого указателя увеличивает его на 256 байт, то есть на следующую строку, что, вероятно, желательно. Как вы уже догадались, письмо 256 буквально является ужасной идеей. Почти так же страшно использовать исходные указатели и выделения. –

ответ

1

Двумерный массив (матрица) не является массивом указателей.

new char[c][256] Выражения выделяет двумерный массив, массив c одномерных массивов каждый из размера 256. Результат представляет собой указатель на первый такой элемент, т.е. char(*)[256].

Наоборот, переменная-указатель, которую вы пытаетесь инициализировать, имеет тип char**, что является указателем на указатель на char. Обычно это указатель на первый элемент в массиве указателей на char. Эта структура не соответствует тому, что вы выделили.


Двумерный массив называется матрицы.

В контексте исходных массивов C и C++ этот термин подразумевает по умолчанию массив массивов.

Массив указателей на массивы называется массивом jagged, поскольку он может иметь (указатели) массивы разных размеров. Например, математическая матрица, значения которой симметричны по диагонали, может храниться в массивах размеров 1, 2, 3 и т. Д. В некоторых случаях зубчатые массивы также используются для реализации квадратных матричных матриц.


Хорошим решением является вместо исходных массивов, используйте vector из string:

vector<string> commands; 

Таким образом, вы даже не должны определять размер фронт.

И пользователю не нужно указывать размер, вы можете только push_back каждой новой команды.

vector Здесь находится std::vector из заголовка <vector> и string является std::string из заголовка <string>.

Для чтения команд, то вы можете использовать std:.getline, а также из <string> заголовка, который избегает чтений только один разделенных пробелов “ ” слова в то время: он читает целую строку в то время.

+0

Благодарим вас за ответ. Я стараюсь избегать использования вектора в соответствии с инструкциями программы. Если я хочу использовать строку, что было бы хорошим решением? Еще раз спасибо. – Zzhh82

+2

Ну, если ваш учитель запрещает использование стандартных контейнеров библиотек и интеллектуальных указателей, вы можете реализовать простой класс строк, который обеспечивает только то, что вы используете. –

+0

Благодарим за помощь! Я думаю, что это хорошая идея. – Zzhh82

0

Попробуйте это:

int c; 
std::cin >> c; 

typedef char CmdBufType[256]; 

CmdBufType* commands = new char[c][256]; 

for(int i = 0; i < c; ++i) 
{ 
    std::cin >> commands[i]; 
} 

Примечания:

  1. Вы также можете написать new CmdBufType[c]; Это то же самое, как new char[c][256];
  2. Лучше писать i < c вместо i <= c - 1
  3. Предпочитают оператору префиксом (++i) вместо постфиксного оператора (i++). В простом случае, как этот, это не имеет большого значения, потому что неинкрементное значение не используется, и компилятор оптимизирует его. Но если i является объектом, скажем, итератором, то это имеет значение.
Смежные вопросы