我写了这个函数,它应该做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;
}
它有效,但有一些奇怪的副作用......其他一些变量也发生了变化。我该如何解决这个问题?
答案 0 :(得分:139)
知道printf为你做填充可能会有所帮助,使用%-10s,因为格式字符串会在10个字符长的字段中填充输入
printf("|%-10s|", "Hello");
将输出
|Hello |
在这种情况下, - 符号表示“左对齐”,10表示“字段中有十个字符”,s表示您正在对齐字符串。
Printf样式格式有多种语言版本,并且在网络上有很多参考资料。这是one of many pages解释格式化标志。像往常一样WikiPedia's printf page也有帮助(主要是关于printf传播范围广泛的历史教训)。
答案 1 :(得分: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
“%*。* s”可以放在“%s”之后的OR之前,具体取决于LEFT或RIGHT padding。
[####Monkey] <-- Left padded, "%*.*s%s"
[Monkey####] <-- Right padded, "%s%*.*s"
我发现PHP printf(here)确实支持使用单引号(')后跟自定义填充字符来提供自定义填充字符 %s格式。
printf("[%'#10s]\n", $s); // use the custom padding character '#'
生产:
[####monkey]
答案 2 :(得分:1)
您传递“Hello”的参数位于常量数据区域。除非你为char * string分配了足够的内存,否则它会超出其他变量。
char buffer[1024];
memset(buffer, 0, sizeof(buffer));
strncpy(buffer, "Hello", sizeof(buffer));
StringPadRight(buffer, 10, "0");
编辑:从堆栈更正到常量数据区。
答案 3 :(得分:1)
您必须确保输入字符串有足够的空间来容纳所有填充字符。试试这个:
char hello[11] = "Hello";
StringPadRight(hello, 10, "0");
请注意,我为hello
字符串分配了11个字节,以便在结尾处考虑空终止符。
答案 4 :(得分:1)
哦,好吧,有道理。所以我这样做了:
char foo[10] = "hello";
char padded[16];
strcpy(padded, foo);
printf("%s", StringPadRight(padded, 15, " "));
谢谢!
答案 5 :(得分:1)
#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;
}
答案 6 :(得分:0)
这个功能对我来说很好看。问题可能是你没有为你的字符串分配足够的空间来填充那么多字符。您可以通过将size_of_string
参数传递给函数来避免此问题,并确保在长度大于大小时不填充字符串。
答案 7 :(得分:0)
在这个线程中形成原始问题的函数中有一件事是绝对错误的,我还没有看到有人提到过,它是将多余的字符连接到作为传递的字符串文字的末尾。参数。这将产生不可预测的结果。在函数的示例调用中,字符串文字“Hello”将被硬编码到程序中,因此可能连接到它的末尾将危险地写入代码。如果你想返回一个比原来大的字符串,你需要确保动态分配它,然后在完成后在调用代码中删除它。
答案 8 :(得分:0)
#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
答案 9 :(得分:0)
#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);
}