출처 : https://m.blog.naver.com/msyang59/220820881511
sprintf(char *buf, const char *format, ...) 함수에서 format 문자열은 buf에 저장되는 문자열의 서식(형식)을 지정하기 위하여 사용됩니다. format은 %[flags][width][.precision][length]specifier로 이뤄집니다.
아두이노에서 지원되는 서식은 성능과 효율성을 위하여 제한적입니다.
서식(format) 양식
%[flags][width][.precision][length]specifier
flags
- 사용되는 width 안에서 왼쪽 정렬
+ +와 - 기호를 숫자 앞에 강제로 출력
# o, x 혹은 X 서식 지정자(specifier)와 같이 사용. 숫자 앞에
0, 0x, 혹은 0X 등을 붙임
0 숫자 앞에 0을 붙임. 0와 공백 문자는 사용된 width 보다 작을 때
붙여 짐
width
숫자 출력할 정수 혹은 문자열의 최소 폭을 지정. 폭보다 출력 되는 숫자
혹은 문자열이 작을 경우 ' '(공백 문자)가 앞에 붙음. <- 0 flag이
붙은 숫자는 0가 붙음
.precision
숫자 d, i, o, u, x 혹은 X 서식 지정자와 같이 사용되어 최소 출력 되는
숫자 길이를 지정하며, 작을 경우 앞에 0을 붙임. 숫자 길이가 긴 경우
잘려 출력 되는 경우는 없음.
length (혹은 modifier를 사용)
h i, d 혹은 u 서식 지정자와 같이 사용되어 short 값을 출력할 때
사용
l i, d 혹은 u 서식 지정자와 같이 사용되어 long int 혹은
unsigned long int 값을 출력할 때 사용
specifier
c 글자(char)를 출력
d 부호가 있는 정수 값 출력
i 부호가 있는 정수 값 출력
u 부호가 없는 정수 값 출력
o 8 진수 부호가 없는 정수 값 출력
x 16 진수 부호가 없는 정수 값 출력. a ~ f 소문자가 출력 됨.
X 16 진수 부호가 없는 정수 값 출력. A ~ F 대문자가 출력 됨.
p 포인터 값이 16 진수 값으로 출력 되며, x 지정자를 사용한 것과 같이
소문자로 출력 됨
s 문자열을 출력
스케치
간단하게 여러 format으로 출력하는 예제 스케치를 만들어 시험하여 보았습니다:
/*
* sprintf2
*
* 이 스케치는 sprintf 함수를 이용하여 문자, 숫자들, 포인터, 그리고
* 문자열을 서식(양식)에 맞춰 출력한 예제입니다.
*
* 이 예제 코드는 공유 저작물입니다.
*
*/
#define MAX_TYPE(type) ((type)(pow(2, sizeof(type) * 8 - 1) - 1))
#define MAX_INT MAX_TYPE(int)
#define MAX_LONG MAX_TYPE(long)
void setup() {
// 여기에 초기화 부분을 넣어 주세요. 이것은 한번만 실행됩니다.
char buf[80];
Serial.begin(9600);
Serial.println("sprintf() 예제 2");
Serial.println("================");
sprintf(buf, "문자들: '%c', '%c'", 'a', (char)97); Serial.println(buf);
sprintf(buf, "숫자들: %10i, %li", MAX_INT, MAX_LONG); Serial.println(buf);
sprintf(buf, "숫자들: %d, %ld", MAX_INT, MAX_LONG); Serial.println(buf);
sprintf(buf, "숫자들: %d, %ld", (unsigned int)(MAX_INT + 1), (unsigned long)(MAX_LONG + 1)); Serial.println(buf);
sprintf(buf, "숫자들: %u, %lu", (unsigned int)(MAX_INT + 1), (unsigned long)(MAX_LONG + 1)); Serial.println(buf);
sprintf(buf, "' ' 문자를 앞에 넣은 숫자: %10d", MAX_INT); Serial.println(buf);
sprintf(buf, "'0' 문자를 앞에 넣은 숫자: %010d", MAX_INT); Serial.println(buf);
sprintf(buf, "왼쪽 정렬: %-10d %ld", MAX_INT, MAX_LONG); Serial.println(buf);
sprintf(buf, "오른쪽 정렬: %10d %ld", MAX_INT, MAX_LONG); Serial.println(buf);
sprintf(buf, "오른쪽 정렬: %10.8d %ld", MAX_INT, MAX_LONG); Serial.println(buf);
sprintf(buf, "+ 기호: %+10d %+ld", MAX_INT, MAX_LONG); Serial.println(buf);
sprintf(buf, "진수들: %04d %04o %#4o %04x %#4x %04X %#4X", 254, 254, 254, 254, 254, 254, 254); Serial.println(buf);
sprintf(buf, "진수들: %4d %4o %#4o %4x %#4x %4X %#4X", 254, 254, 254, 254, 254, 254, 254); Serial.println(buf);
sprintf(buf, "포인터: %p", &buf); Serial.println(buf);
sprintf(buf, "문자열: %s", "아두이노"); Serial.println(buf);
}
void loop() {
// 여기에 주 처리 부분을 넣어 주세요. 이것은 반복 실행됩니다.
}
첨부
실행
스케치를 업로드하고 시리얼 모니터를 열면 다음과 같은 결과를 얻을 수 있습니다: