题
我写了这个函数,它应该做StringPadRight(<!> quot; Hello <!>;,10,<!>!0 <!>;) - <!> gt; QUOT <!>; Hello00000 QUOT <!>;
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 <!>”之前或之后,取决于LEFT或RIGHT padding的愿望。
[####Monkey] <-- Left padded, "%*.*s%s"
[Monkey####] <-- Right padded, "%s%*.*s"
我发现PHP printf(此处)支持提供自定义功能填充字符,使用单引号(')后跟自定义填充字符,在%s格式内。
printf("[%'#10s]\n", $s); // use the custom padding character '#'
结果
生产:点击
[####monkey]
您必须确保输入字符串有足够的空间来容纳所有填充字符。试试这个:
char hello[11] = "Hello";
StringPadRight(hello, 10, "0");
请注意,我为hello
字符串分配了11个字节,以便在结尾处考虑空终止符。
您传递的参数<!>“Hello <!>”;在恒定数据区域。除非你为char * string分配了足够的内存,否则它会超出其他变量。
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;
}
这个功能对我来说很好看。问题可能是你没有为你的字符串分配足够的空间来填充那么多字符。您可以通过将size_of_string
参数传递给函数来避免此问题,并确保在长度大于大小时不填充字符串。
在这个线程中形成原始问题的函数中有一件事是绝对错误的,我还没有看到有人提到过,它是将多余的字符连接到作为一个传入的字符串文字的末尾。参数。这将产生不可预测的结果。在函数的示例调用中,字符串文字<!>“Hello <!>”;将被硬编码到程序中,因此可能连接到它的末尾将危险地写入代码。如果你想返回一个比原来大的字符串,你需要确保动态分配它,然后在完成后在调用代码中删除它。
#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;
}
输出:
$ gcc -Wall -ansi -pedantic padding.c
$ ./a.out
###############Hello
#include<stdio.h>
#include <string.h>
void padLeft(int length, char pad, char* inStr,char* outStr) {
int minLength = length * sizeof(char);
if (minLength < sizeof(outStr)) {
return;
}
int padLen = length - strlen(inStr);
padLen = padLen < 0 ? 0 : padLen;
memset(outStr, 0, sizeof(outStr));
memset(outStr, pad,padLen);
memcpy(outStr+padLen, inStr, minLength - padLen);
}