我曾尝试自己做但却失败了(我很想再次学习它,但只需要一个示例程序)。基本上我希望代表一个二进制数,但当然填充到最近的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,然后在那之后复制二进制文件,但是如何让它工作逃脱了我..
答案 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);