Как бы вы добавили символы в массив динамически?Без предопределенного массива? - PullRequest
3 голосов
/ 06 мая 2011

Если я хочу добавить символы в массив символов, я должен сделать это следующим образом:

#include <stdio.h>

int main() {
    int i;
    char characters[7] = "0000000";
    for (i = 0; i < 7; i++) {
        characters[i] = (char)('a' + i);
        if (i > 2) {
            break;
        }
    }

    for (i = 0; i < 7; i++) {
        printf("%c\n", characters[i]);
    }
    return 0;
}

Чтобы предотвратить печать каких-либо странных символов, я должен инициализировать массив, но он не гибкий.Как я могу динамически добавлять символы в массив символов?Как и в Python:

characters = []
characters.append(1)
...

Ответы [ 3 ]

10 голосов
/ 06 мая 2011

Не существует некрасивого решения для чистого C.

#include <stdio.h>

int main() {
    int i;
    size_t space = 1;                  // initial room for string
    char* characters = malloc(space);  // allocate
    for (i = 0; i < 7; i++) {
        characters[i] = (char)('a' + i);
        space++;                       // increment needed space by 1
        characters = realloc(characters, space); // allocate new space
        if (i > 2) {
            break;
        }
    }

    for (i = 0; i < 7; i++) {
        printf("%c\n", characters[i]);
    }
    return 0;
}

На практике вы хотите избежать использования realloc и, конечно, выделять память большими блоками, чем один байт, возможно дажеэкспоненциальная скорость.Но по сути это то, что происходит под капотом std :: string и тому подобного: вам нужен счетчик, который подсчитывает текущий размер, переменную текущего максимального размера (здесь это всегда текущий размер + 1, для простоты) инекоторое перераспределение, если потребность в пространстве превышает максимальный размер тока.

4 голосов
/ 06 мая 2011

Да, конечно, вы можете добавлять символы динамически:

quote char[100] = "The course of true love";
      strcat( quote, " never did run smooth.";

, но только если в кавычках [] достаточно места для хранения добавленных символов.Или, может быть, вы спрашиваете, почему в C вы должны предварительно организовать достаточно хранилища символов, тогда как в Python хранилище выделяется динамически.Вот как язык был разработан в 197x году.

C99 позволяет динамически распределенное хранилище: хранилище, выделенное системой во время выполненияИ это очень плохая ошибка, имо.

0 голосов
/ 06 мая 2011

Вы не можете, если не используете Связанные списки или какую-либо другую пользовательскую структуру данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...