我写了这个函数,它应该做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);
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top