Моя функция заполнения строк в C не работает? - PullRequest
0 голосов
/ 05 декабря 2010

Я пытался сделать это сам, но потерпел неудачу (я испытываю желание сделать это снова для обучения, но мне просто нужно это для примера программы). По сути, я хочу представить двоичное число, но, конечно, дополненное до ближайшего байта с 0, поэтому я нашел здесь функцию по другому вопросу:

char * string_pad(char * string, size_t padlen, char * pad) {
    size_t lenstring = strlen(string);
    size_t lenpad = strlen(pad);

    char * padded = (char*)malloc(lenstring + lenpad + 1);
    strncpy(padded, string, lenstring); /* copy without '\0' */
    padded += lenstring; /* prepare for first append of pad */
    for(padlen += 1; padlen > 0; padlen--, padded += lenpad)
        strncpy(padded, pad, lenpad);
    *padded = '\0';
    return padded;
}

Я называю это так:

printf("Test: %s\n", string_pad(dec2bin(~myInt), 32, "0"));

К сожалению, он печатает «Test:», но ничего больше. Мой dec2bin, кстати, возвращает простой символьный указатель, если вам нужно знать.

Что, кажется, заставляет его ничего не делать?

Почему эта функция принимает char * pad, а не char pad, так что я могу просто добавить его с помощью '0', будет ли работать "0" или добавить нулевой терминатор, облажав его или что-то еще?

РЕДАКТИРОВАТЬ : Или кто-нибудь может привести простой пример (или что мне нужно сделать), чтобы оставить для этого отступ? Этот фрагмент выглядит не так уж хорошо ..

Я думал о создании chararray, инициализированного в ноль, затем копировании двоичного файла после этого, но как заставить его работать, ускользнуло от меня ..

Ответы [ 2 ]

4 голосов
/ 05 декабря 2010

"padded" указывает на конец строки, когда вы ее возвращаете.

0 голосов
/ 05 декабря 2010

Вот простой пример реализации. Он управляет вызывающим абонентом и передает его в пространство, где будет выполняться заполнение.

char *PadLeft(char *bufBeg, size_t bufSize, char padChar)
{
    char *p = bufBeg;
    char *end = bufBeg + bufSize;

    while (p < end && isspace(*p))
    {
         *p = padChar;
         p++;
    }

    return bufBeg;
}

В действии это выглядело бы так ...

char padArea[32 + 1];

snprintf(padArea, sizeof(padArea), "%*s", sizeof(padArea) - 1, dec2bin(~myInt));

PadLeft(padArea, sizeof(padArea), '0');
...

... или ...

int padAreaSize = 32 + 1;

char *padArea = malloc(padAreaSize);

snprintf(padArea, padAreaSize, "%*s", padAreaSize - 1, dec2bin(~myInt));

PadLeft(padArea, padAreaSize, '0');

...

free(padArea);

(не забудьте добавить проверку ошибок, оставьте здесь для ясности)

Правая функция пэда будет аналогичной:

char *PadRight(char *bufBeg, size_t bufSize, char padChar)
{
    char *p = bufBeg + bufSize;

    while (--p >= bufBeg && isspace(*p))
    {
         *p = padChar;        
    }

    return bufBeg;
}

int padAreaSize = 32 + 1;

char *padArea = malloc(padAreaSize);

snprintf(padArea, padAreaSize, "%-*s", padAreaSize - 1, dec2bin(~myInt));

PadRight(padArea, padAreaSize, '0');

...

free(padArea);
...