2013-12-01 2 views
0

В моем приложении мы принимаем значения char по одному, и мы должны иметь возможность, но их в строку. Мы собираем эти строки один за другим, помещая значения char в массив символов, а затем очищая массив. Однако строки имеют разные длины, и мы не можем определить размер строки. Как мы можем изменить размеры массива, чтобы добавить больше пространства по мере необходимости?Постоянная настройка размера массива с помощью C

Также, как мы можем распечатать массив?

+0

Удивительно, если указатели будут хорошей альтернативой использованию массивов в этом сценарии. – dreamerkumar

+0

@ Указатели VishalKumar полезны, если они указывают куда-то. Ваше утверждение само по себе совершенно бессмысленно без этой мысли. – glglgl

+0

Извините за вводящий в заблуждение комментарий. Я действительно имел в виду использование указателей для создания связанного списка. Это дает вам всю гибкость в назначении памяти каждому элементу связанного списка. – dreamerkumar

ответ

4

Если массив был динамически распределяемой с malloc, вы можете изменить его с realloc:

int array_size = 1024; 
char *array = (char *) malloc(array_size); 

int n = 0; 
char c; 
while ((c = getchar()) != EOF) { 
    array[n++] = c; 
    if (n >= array_size) { 
     array_size += 1024; 
     array = (char *) realloc(array_size); 
    } 
} 
array[n] = '\0'; 

Для распечатки содержимого массива, вы можете просто передать его printf или puts:

printf("%s\n", array); 
puts(array); 
+2

почему ['sizeof (char)'] (http://stackoverflow.com/q/2215445/296974)? И [почему '(char *)' перед 'malloc()'] (http://stackoverflow.com/q/605845/296974)? – glglgl

+0

Для согласованности и ясности в отношении ваших намерений, но также для учета построения на машине, на которой один символ не является одним машинным байтом. –

+1

Ouch. Символ * * для определения * * всегда * один байт. См. Ссылку, которую я опубликовал. – glglgl

0

, если вы не знаете размер, который вам понадобится, и добавьте по одному символу за один раз, когда вы можете использовать linked list. Он может расти настолько, насколько вам нужно. Недостатки будут выглядеть медленными, и если вам нужно освободить память или очистить ее, вам придется делать это для каждого элемента, по одному за раз.

Вы также можете принять подход dynamic array: выделите определенный размер, который вы считаете достаточно большим, и когда он заполнен на 80%, выделите новый буфер в два раза больше и скопируйте содержимое старого в новом, более крупном один.

+0

Почему, когда он заполнен на 80%? Кажется, мне лучше выбрать 100%. Ваш путь, вы всегда выделяете 20% слишком много, которое никогда не используется и не требуется. – glglgl

+0

80% действительно просто и пример, и это обычно используемый порог. Причина, по которой вы не дождались заполнения буфера, заключается в том, что вы хотите избежать ситуации, когда вам нужно выделять больше памяти, когда вам это нужно. это займет много времени, чтобы выделить новый, больший буфер и скопировать содержимое старого, когда у вас закончилась нехватка памяти. Но если вы планируете эту операцию, когда вы не заполняете буфер данными, штраф почти несуществующий – Pandrei

+0

Зачем копировать? 'realloc' позволяет выделить дополнительную память в конце блока, если окажется, что блок памяти слишком мал. –

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