Используя C, преобразуйте динамически размещенный массив int в строку, разделенную запятыми, насколько это возможно - PullRequest
7 голосов
/ 17 ноября 2009

Я гораздо менее опытен в C, чем в языках более высокого уровня. В Cisco мы используем C, и я иногда сталкиваюсь с чем-то, что было бы легко сделать в Java или Python, но очень трудно сделать в C. Сейчас один из таких случаев.

У меня есть динамически распределяемый массив целых чисел без знака, которые мне нужно преобразовать в разделенную запятыми строку для регистрации. Хотя целые числа вряд ли будут очень большими, концептуально они могут быть в диапазоне от 0 до 4 294 967 295. В Python это одна короткая строка.

my_str = ','.join(my_list)

Насколько элегантно люди могут делать это в Си? Я придумал способ, но он грубый. Если кто-нибудь знает хороший способ сделать это, пожалуйста, просветите меня.

Ответы [ 13 ]

0 голосов
/ 17 ноября 2009

К сожалению, всегда будет три случая:

  • Пустой список (без запятых, без элементов)
  • Один элемент (без запятых, один элемент)
  • Два или более элемента (n-1 запятых, n элементов)

Метод join скрывает эту сложность для вас, поэтому он так хорош.

В Си я бы сделал:

for (i = 0; i < len; i++)
{
    if (i > 0)   /* You do need this separate check, unfortunately. */
        output(",");
    output(item[i]);
}

Где output однако вы добавляете к строке. Это может быть просто strcat в предварительно выделенном буфере или printf для какого-либо потока (например, поток памяти, о котором я узнал сегодня в Создание потока FILE *, который приводит к строке : -.)

Если вас раздражает выполнение этой проверки каждый раз для всех i> = 1, вы можете сделать:

if (i > 0)
{
    output(item[0]);
    for (i = 1; i < len; i++)
    {
        output(",");
        output(item[i]);
    }
}
0 голосов
/ 17 ноября 2009

Лично для простоты и, вероятно, скорости я бы выделил большой буфер с пространством для массива размером «4 294 967 295» и «,» для каждого элемента. Хотя при создании списка это не экономит место!

Тогда я бы вставил туда целые числа и добавил "," ко всем элементам

Наконец-то я бы перераспределил указатель так, чтобы он занимал не больше места, чем требовалось. (размер = strlen)

sprintf: в случае успеха возвращается общее количество написанных символов. В это число не входит дополнительный нулевой символ, автоматически добавляемый в конец строки.

Вот как вы отслеживаете, где находится strcpy в строке. :)

Надеюсь, это поможет! :)

И если вы просто хотите распечатать их, посмотрите другие ответы. (для цикла и printf)

0 голосов
/ 17 ноября 2009

Предполагая, что когда вы упоминаете «для ведения журнала», вы подразумеваете запись в файл журнала, тогда ваше решение может выглядеть примерно так (псевдокодировано):

for (int x in array) {
    fprintf(log, "%d", x);
    if (! last element)
        fputc(log, ',');
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...