【问题标题】:My string padding function in C does not work?我在 C 中的字符串填充函数不起作用?
【发布时间】:2010-12-05 06:32:37
【问题描述】:

我曾尝试自己做,但失败了(我很想再做一次来学习,但只需要它用于示例程序)。本质上,我希望表示一个二进制数,但当然用0's 填充到最近的字节,所以我在这里找到了另一个问题的函数:

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” 也可以工作,还是添加一个空终止符来搞砸它?

编辑:或者有人可以提供一个简单的例子(或者我需要做什么)来填补这个?这个sn-p似乎不是那么好..

我正在考虑创建一个初始化为零的 chararray,然后复制二进制文件,但如何让它工作却让我无法理解..

【问题讨论】:

  • 对于初学者来说,malloc 看起来不对 - 它应该至少分配 (padlen + 1) 个字节。
  • 注意到,让我想知道这段代码 sn-p 是否值得修复.. 我唯一的另一个 sn-p 这样做使用 sprintf 不正确:P.
  • F:你使用这个函数的方式是内存泄漏。它返回一个指向 malloc'ed 内存的指针,您使用该指针作为printf 的参数。它使用指针作为临时变量,现在你无法free 内存。

标签: c pointers printf padding


【解决方案1】:

"padded" 在你返回时指向字符串的结尾。

【讨论】:

  • 修复函数后不要忘记释放返回的字符串。
  • 我试图做指针运算padded -= lenpad + 1; 但只显示三个零(无论输入什么),我不知道该怎么做。
  • @eyalm:他无法释放示例中的内存。返回值在 printf 调用中用作未命名的临时值。
  • @John F 我建议您为字符串分配另一个指针(就在 malloc 之后)并返回它,这样您就不需要进行额外的指针运算。即 char *ptr = padded;
  • @Plow,我相信现在可行,但我忘了它是右而不是左,伙计,我为此感到压力..
【解决方案2】:

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

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

(不要忘记添加错误检查,为了清楚起见,此处省略)

pad right 功能类似:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-21
    • 2019-09-26
    • 2021-05-22
    • 1970-01-01
    相关资源
    最近更新 更多