2015-09-10 1 views
1

Пройдя десятки уроков & руководства по программированию, ответ не стал очевидным, следовательно, сообщение. Пожалуйста, будьте добры.
Дело в том, что практические манипуляции с массивами двойного d char .: {"aaaaa", "bbbbb", "ccccc", .... M}
Первой проблемой является объявление инициализации таких звери, с целью изменения данных в строках «AAAAA», «BBBBB» и т.д.
заявления и инициализации идут как:Как управлять 2-мерным массивным массивом?

char *chararray[M][N + 1] //M & N are set as constant values, the extra 1 for the null terminator. 
    memset (chararray, '\0', sizeof(chararray)); //Assuming array bounds remain constant, in the hope that dynamic allocation is not required 

Предположим, что существует также строковым определяется:

char *copyme; //Has been given a string value well within the bounds of N 

Проблема возникает при попытке использовать этот i п strcat или strcat_s (зЬгсру или strcpy_s подобное):

strcat_s (chararray [i][0], N + 1, (char *) copyme); //i ranges from 0 to M 

После не попадается какой-либо код, который обрабатывает массивы таким образом, я сделал примечание от этого tutorial, что тетсру является единственным способом. Верный?

Также, как реализовать функцию General Procedure Джона Боде при вызове функции из Main? (Для краткости, это, возможно, придется быть представлен как отдельный вопрос,)

+2

'char x [M] [N + 1];' будет 2-мерным массивом символов. Можете ли вы подтвердить, хотите ли вы это, или 'char * x [M] [N + 1]', который является 2-мерным массивом указателей? –

+0

Хотите указатели. _I think_ char chararray [M] [N + 1] doesn; t, похоже, вообще работает с strcpy. –

+0

Итак, вы хотите иметь возможность хранить 'M' x' N + 1' количество строк? Например. если «M» равно 5, а «N» равно 6, вы сохраняете 35 строк. –

ответ

1

вероятно Вы имели в виду

char chararray[M][N + 1]; 

, чтобы затем скопировать строку, указать первый индекс

strcat_s(chararray[i], N + 1, (char *) copyme); 

Если вы объявили как

char *chararray[M][N + 1] 

то у вас есть 2-мерный массив указателей, которые являются NULL а затем, когда вы derefence их, вы получите ошибку:

strcat_s(chararray [i][0], N + 1, (char *) copyme); // boom! 
+0

За исключением того, что chararray неправильно объявлен как 2D-массив _pointers_, поэтому вы не можете копировать что-либо в него, программа может сбой и запись. – Lundin

+0

@ Lundin Думаю, он отредактировал вопрос –

+0

Он этого не сделал. 'char * chararray [M] [N + 1]' – Lundin

3

Ваша инициализация неправильно, вы объявляете 2D-массив указателей не символы. Измените его на char chararray[M][N + 1].

Также в отношении комментария к memset вы объявили массив со статическими измерениями, поэтому границы никогда не изменится, и вы не сможете использовать динамическое распределение, если вы выбрали вышеуказанный метод.

В основном у вас есть следующие варианты при использовании массивов строк в C:

  • В случае, если вы только дело с строковых литералов только для чтения, вы можете использовать const char* за буквальным. Тогда массив строк в этом случае будет массивом из указателей const char*.
  • Аналогичным образом, вы можете иметь массив указателей, если строки выделены в другом месте, а не в вашем массиве. У вас будет таблица поиска.
  • Если длина строк имеет известный максимум, вы можете объявить ее со статическими размерами, такими как char chararray[M][N + 1]. Это 2D-массив символов, или если вы будете: массив массивов символов.
  • Если длина строк неизвестна, если вам нужно, чтобы они были гибкими, или если вы выделяете большое количество строк (несколько сотен), вы можете выделить их в кучу. В этом случае вы должны использовать массив указателей, где каждому указателю присваивается строка через malloc, за которой следует strcpy().
+0

Путаница в моем случае была в описании strcpy & strcat. Первый параметр char * _Dst, второй - постоянный char * _Src. Оба символа char *, как в примере [MSDN] (https://msdn.microsoft.com/en-us/library/tbyd7s1y.aspx?f=255&MSPPError=-2147217396). –

Смежные вопросы