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;
}
The function itself looks fine to me. The problem could be that you aren't allocating enough space for your string to pad that many characters onto it. You could avoid this problem in the future by passing a size_of_string
argument to the function and make sure you don't pad the string when the length is about to be greater than the size.
One thing that's definitely wrong in the function which forms the original question in this thread, which I haven't seen anyone mention, is that it is concatenating extra characters onto the end of the string literal that has been passed in as a parameter. This will give unpredictable results. In the example call of the function, the string literal "Hello" will be hard-coded into the program, so presumably concatenating onto the end of it will dangerously write over code. If you want to return a string which is bigger than the original then you need to make sure you allocate it dynamically and then delete it in the calling code when you're done.
#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;
}
Output:
$ 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);
}
참고URL : https://stackoverflow.com/questions/276827/string-padding-in-c
'code' 카테고리의 다른 글
문자열에서 접두사 제거 (0) | 2020.10.31 |
---|---|
forEach 루프 Java 8 for Map 항목 세트 (0) | 2020.10.31 |
md5 해시 바이트 배열을 문자열로 변환 (0) | 2020.10.31 |
SQL Server Management Studio에서 SSIS 패키지를 보려면 어떻게합니까? (0) | 2020.10.30 |
예외 발생 대 함수에서 None 반환? (0) | 2020.10.30 |