C中的字符串填充

72 c string padding

我写了这个函数,它应该做StringPadRight("Hello",10,"0") - >"Hello00000".

char *StringPadRight(char *string, int padded_len, char *pad) {
    int len = (int) strlen(string);
    if (len >= padded_len) {
        return string;
    }
    int i;
    for (i = 0; i < padded_len - len; i++) {
        strcat(string, pad);
    }
    return string;
}
Run Code Online (Sandbox Code Playgroud)

它有效,但有一些奇怪的副作用......其他一些变量也发生了变化.我怎样才能解决这个问题?

Tom*_*eys 149

知道printf为你做填充可能会有所帮助,使用%-10s,因为格式字符串会在10个字符长的字段中填充输入

printf("|%-10s|", "Hello");
Run Code Online (Sandbox Code Playgroud)

将输出

|Hello     |
Run Code Online (Sandbox Code Playgroud)

在这种情况下, - 符号表示"左对齐",10表示"字段中的十个字符",s表示您正在对齐字符串.

Printf样式格式有多种语言版本,并且在网络上有很多参考.这是解释格式化标志的许多页面之一.像往常一样,WikiPedia的printf页面也有帮助(主要是有关printf传播范围广泛的历史教训).

  • 如果你想让字符串被除了空格之外的另一个字符填充怎么办?有没有办法做这个C的printf? (4认同)
  • @胜利者。抱歉,我以为你是在回答我的答案,而不是彼得随后的问题。是的,你只能选择用 0 或 ' ' 来填充,不能有其他的。 (2认同)

J J*_*son 38

对于'C',当需要自定义填充时,[s] printf的替代(更复杂)使用不需要任何malloc()或预格式化.

诀窍是对%s使用'*'长度说明符(min和max),加上填充了填充字符的字符串到最大潜在长度.

int targetStrLen = 10;           // Target output length  
const char *myString="Monkey";   // String for output 
const char *padding="#####################################################";

int padLen = targetStrLen - strlen(myString); // Calc Padding length
if(padLen < 0) padLen = 0;    // Avoid negative length

printf("[%*.*s%s]", padLen, padLen, padding, myString);  // LEFT Padding 
printf("[%s%*.*s]", myString, padLen, padLen, padding);  // RIGHT Padding 
Run Code Online (Sandbox Code Playgroud)

"%*.*s"可以放在"%s"之后的OR之前,这取决于LEFT或RIGHT填充的要求.

[####Monkey] <-- Left padded, "%*.*s%s"
[Monkey####] <-- Right padded, "%s%*.*s"

我发现PHP printf(这里)确实支持在%s格式中使用单引号(')后跟自定义填充字符来提供自定义填充字符的功能.
printf("[%'#10s]\n", $s); // use the custom padding character '#'
生产:
[####monkey]


小智 7

#include <stdio.h>
#include <string.h>

int main(void) {
    char buf[BUFSIZ] = { 0 };
    char str[] = "Hello";
    char fill = '#';
    int width = 20; /* or whatever you need but less than BUFSIZ ;) */

    printf("%s%s\n", (char*)memset(buf, fill, width - strlen(str)), str);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

$ gcc -Wall -ansi -pedantic padding.c
$ ./a.out 
###############Hello
Run Code Online (Sandbox Code Playgroud)