[c] C의 문자열 패딩

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은 “필드의 10 개 문자”를 의미하며 s는 문자열을 정렬하고 있음을 의미합니다.

Printf 스타일 서식은 여러 언어로 제공되며 웹에서 많은 참조가 있습니다. 다음은 서식 플래그를 설명하는 여러 페이지 중 하나입니다 . 평소처럼 WikiPedia의 printf 페이지 도 도움이됩니다 (대부분 printf가 얼마나 널리 퍼 졌는지에 대한 역사 교훈).


답변

‘C’의 경우 사용자 정의 패딩이 필요할 때 malloc () 또는 사전 서식 지정이 필요하지 않은 [s] printf의 대체 (더 복잡한) 사용이 있습니다.

트릭은 % s에 대해 ‘*’길이 지정자 (최소 및 최대)를 사용하고 패딩 문자로 최대 잠재적 길이까지 채워진 문자열을 사용하는 것입니다.

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”는 LEFT 또는 RIGHT 패딩에 대한 요구에 따라 “% s”앞 또는 뒤에 배치 할 수 있습니다.

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

PHP printf ( here )는 % s 형식 내에서 작은 따옴표 ( ‘) 다음에 사용자 정의 패딩 문자를 사용하여 사용자 정의 패딩 문자를 제공하는 기능을 지원 한다는 것을 발견했습니다 .
printf("[%'#10s]\n", $s); // use the custom padding character '#'
생성 :
[####monkey]


답변

입력 문자열에 모든 패딩 문자를 담을 수있는 충분한 공간이 있는지 확인해야합니다. 이 시도:

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

hello마지막에 null 종결자를 설명하기 위해 문자열에 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;
}


답변

#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