我写了这个函数,它应该做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传播范围广泛的历史教训).
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)