C snprintf() 메모리 영역으로 크기만큼 서식에 맞추어 문자열 출력 함수
메모리 영역으로 서식에 맞추어 출력합니다. snprintf()는 매우 안전한 함수로 지정한 길이에 해당하는 위치에 반드시 NULL문자를 삽입해 줍니다. 즉, 버퍼 크기가 10이고 snprintf()에 버퍼 크기 10으로 요청하면 변환되는 문자열이 버퍼 크기보다 크다고 해도 9개의 문자를 입력해 준 다음 10번째에 NULL이 대입됩니다. 즉, 버퍼 크기를 정확히 알려주면 오버플로우가 발생하지 않습니다.
- 헤더: stdio.h
- 형태: int snprintf( char *s , size_t size, const char *format, ...)
- 인수: char *s 서식에 맞추어 저장할 메모리 영역의 포인터
size_t size 출력할 문자 개수
const char *format 출력할 데이터 서식
... 서식에 맞춘 변수 나열
- 반환: int NULL까지의 크기가 아니라 실제로 변환에 필요한 길이. 오류가 발생하면 음수를 반환합니다.
서실 변환 문자열
변환 문자열 |
의미 |
%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", "badayak.com") |
badayak.com |
문자열 출력 |
printf("%20s", "badayak.com") |
_________badayak.com |
문자열 출력 |
printf("%7s", "badayak.com") |
badayak.com |
문자열이 더 길면 그대로 출력 |
printf("%.7s", "badayak.com") |
badayak |
문자열이 더 길면 잘라서 출력(%점7s) |
printf("%-20s", "badayak.com") |
badayak.com_________ |
문자열을 왼쪽 맟춤으로 하여 오른쪽에 모자르는 자리를 공백으로 메꿈 |
printf("%10.2s", "badayak.com") |
________by |
문자열 앞의 두 문자만 출력하되 앞에 공문자를 채워서 전체 10 문자로 출력 |
printf("%10.2s", "badayak.com") |
by________ |
문자열 앞의 두 문자만 출력하되 뒤에 공문자를 채워서 전체 10 문자로 출력 |
C언어 snprintf() 함수 예제
#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;
}
C언어 snprintf() 예제 실행 결과
]$ ./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
]$