C中的string填充

我写了这个应该做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作为格式string将填充input的字段长度为10个字符

 printf("|%-10s|", "Hello"); 

会输出

 |Hello | 

在这种情况下, – 符号表示“左alignment”,10表示“在字段中的十个字符”,s表示您正在alignment一个string。

Printf风格的格式有很多种语言可供select,并在网上有大量的参考。 这是解释格式标志的许多页面之一 。 像往常一样, WikiPedia的printf页面也有帮助(主要是printf传播的历史教训)。

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

诀窍是使用'*'长度说明符(最小值和最大值)作为%s,加上填充字符的string以最大可能长度。

 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”之前或之后,取决于对LEFT或RIGHT填充的要求。

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

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

您必须确保inputstring有足够的空间容纳所有填充字符。 尝试这个:

 char hello[11] = "Hello"; StringPadRight(hello, 10, "0"); 

请注意,我为hellostring分配了11个字节来说明最后的空终止符。

您传递“Hello”的参数位于常量数据区域中。 除非你已经为char *string分配了足够的内存,否则它会超出其他variables。

 char buffer[1024]; memset(buffer, 0, sizeof(buffer)); strncpy(buffer, "Hello", sizeof(buffer)); StringPadRight(buffer, 10, "0"); 

编辑:更正从堆栈到常数数据区域。

哦,好吧,有道理。 所以我这样做了:

  char foo[10] = "hello"; char padded[16]; strcpy(padded, foo); printf("%s", StringPadRight(padded, 15, " ")); 

谢谢!

 #include <iostream> #include<stdio.h> #include<stdlib.h> #include<string.h> using namespace std; int main() { // your code goes here int pi_length=11; //Total length char *str1; const char *padding="0000000000000000000000000000000000000000"; const char *myString="Monkey"; int padLen = pi_length - strlen(myString); //length of padding to apply if(padLen < 0) padLen = 0; str1= (char *)malloc(100*sizeof(char)); sprintf(str1,"%*.*s%s", padLen, padLen, padding, myString); printf("%s --> %d \n",str1,strlen(str1)); return 0; } 

function本身看起来很好。 问题可能是您没有为您的string分配足够的空间来填充许多字符。 将来可以通过给函数传递一个size_of_string参数来避免这个问题,并确保当长度大于大小时不要填充string。

在这个线程中形成原始问题的函数肯定是错误的,我没有看到任何人提到,它将多余的字符连接到作为参数传入的string的末尾。 这会给不可预知的结果。 在函数的示例调用中,string文字“Hello”将被硬编码到程序中,因此大概在它的尾部连接将危险地写代码。 如果你想返回一个比原来大的string,那么你需要确保你dynamic地分配它,然后在你完成后在调用代码中删除它。