我在C中的字符串填充功能不起作用?

时间:2010-12-04 21:23:53

标签: c pointers printf padding

我曾尝试自己做但却失败了(我很想再次学习它,但只需要一个示例程序)。基本上我希望代表一个二进制数,但当然填充到最近的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"));

不幸的是,它打印“测试:”但没有别的。如果你需要知道的话,我的dec2bin会返回一个简单的char指针。

什么似乎导致它什么都不做?

为什么这个函数接受char * pad而不是char pad所以我可以用“0”填充它,“0”也可以工作,还是添加一个空终结器搞砸了什么?

编辑:或者有人可以提供一个简单的示例(或我需要做什么)来填充左边的内容?这个片段看起来并不那么好......

我正在考虑创建一个初始化为零的chararray,然后在那之后复制二进制文件,但是如何让它工作逃脱了我..

2 个答案:

答案 0 :(得分:4)

当你返回时,

“padded”指向字符串的末尾。

答案 1 :(得分:0)

这是一个简单的示例实现。它依赖于调用者来管理和传递将执行填充的空间。

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);