C언어 메모리 영역으로 크기만큼 서식에 맞추어 문자열 출력 함수 snprintf()

2020. 3. 18. 07:03 컴퓨터/프로그래밍

C함수 메모리 영역으로 크기만큼 서식에 맞추어 문자열 출력 snprintf()

메모리 영역으로 서식에 맞추어 출력합니다. snprintf()는 매우 안전한 함수로 지정한 길이에 해당하는 위치에 반드시 NULL문자를 삽입해 줍니다. 즉, 버퍼 크기가 10이고 snprintf()에 버퍼 크기 10으로 요청하면 변환되는 문자열이 버퍼 크기보다 크다고 해도 9개의 문자를 입력해 준 다음 10번째에 NULL이 대입됩니다. 즉, 버퍼 크기를 지정하면 오버플로우되는 문제가 없습니다.

  • 헤더: stdio.h
  • 형태: int *printf( const char s, , size_t size, const char *format, ...)
  • 인수: char *s 서식에 맞추어 저장할 메모리 영역의 포인터
    size_t size 춮력할 문자 개수
    const char *format 출력할 데이터 서식
    ... 서식에 맞춘 변수 나열
  • 반환: int NULL까지의 크기가 아니라 실제로 변환에 필요한 길이. 오류가 발생하면 음수를 반환합니다.
reference

서실 변환 문자열

변환 문자열 의미
%o 8진 정수 형식으로 입력
%d 10진 정수 형식으로 입력
%ld long형 10진 정수 형식으로 입력
%x 16진 정수 형식으로 입력
%f float 형 형식으로 입력
%lf double 형 형식으로 입력
%c 문자 형식으로 입력
%s 문자열 형식으로 입력

서식 문자열에 옵션을 추가하여 좀 더 다양하게 출력할 수 있습니다.


변환 문자열 출력 의미
printf("%d", 123) 123 표준 출력장치로 출력
printf("%5d", 123) ___123 10진수를 5자리에 맞추어 출력, 123앞에 공백 2개 추가
printf("%-5d", 123) 123__ 10진수를 5자리에 맞추어 출력, 왼쪽 맞춤, 오른쪽에 공백 추가
printf("%f", 1.234567) 1.234567 16진 정수 형식으로 출력
printf("%4f", 1.234567) 1.2346 소쉄 이하 4자리 출력, 반올림
printf("%7.2f", 1.234567) ___1.23 소숫점 포함해서 전체 7자리, 소수점 이하 2자리. 공백 3개가 앞 부분에 추가됩니다.
printf("%s", "byadayak.com") byadayak.com 문자열 출력
printf("%20s", "byadayak.com") ________byadayak.com 문자열 출력
printf("%.8s", "byadayak.com") byadayak.com 문자열이 더 길면 그대로 출력
printf("%.10s", "byadayak.com") byadayak 문자열이 더 길면 잘라서 출력
printf("%-20s", "byadayak.com") byadayak.com________ 문자열을 왼쪽 맟춤으로 하여 오른쪽에 모자르는 자리를 공백으로 메꿈
printf("%10.2s", "byadayak.com") ________by 문자열 앞의 두 문자만 출력하되 앞에 공문자를 채워서 전체 10 문자로 출력
printf("%10.2s", "byadayak.com") by________ 문자열 앞의 두 문자만 출력하되 뒤에 공문자를 채워서 전체 10 문자로 출력
 

예제

#include <stdio.h>
#include <string.h>

int main( void)
{
   char  buf[1024];
   int   ret;

   bzero( buf, sizeof( buf));
   ret   = snprintf( buf, 10, "%d %x %s", 123, 123, "badayak.com");
   printf( "ret=%d buf=[%s]\n", ret, buf);

   for ( int ndx = 0; ndx < 15; ndx++){
      printf( "%d]%02x ", ndx, buf[ndx] & 0xff);
   }
   printf( "\n");
   return 0;
}

실행 결과

]$ ./a.out
ret=18 buf=[123 7b ba]
0]31 1]32 2]33 3]20 4]37 5]62 6]20 7]62 8]61 9]00 10]00 11]00 12]00 13]00 14]00
]$


이 댓글을 비밀 댓글로