我写了这个函数,它应该做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; }
它有效,但有一些奇怪的副作用......其他一些变量也发生了变化.我怎样才能解决这个问题?
知道printf为你做填充可能会有所帮助,使用%-10s,因为格式字符串会在10个字符长的字段中填充输入
printf("|%-10s|", "Hello");
将输出
|Hello |
在这种情况下, - 符号表示"左对齐",10表示"字段中的十个字符",s表示您正在对齐字符串.
Printf样式格式有多种语言版本,并且在网络上有很多参考.这是解释格式化标志的许多页面之一.像往常一样,WikiPedia的printf页面也有帮助(主要是有关printf传播范围广泛的历史教训).
对于'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
"%*.*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]