main.c
1. 처음에 위에 코드대로 돌리면 아래와 같은 오류가 뜬다. SDL 검사에 아니오를 선택하면 사라진다. 2. sprintf(PID_val, "TEST %04X%04X", conv.u_val[1],conv.u_val[0]); 여기서 %04X를 안하면 4자리수가 안되었을 때 0이 표시가 안되서 오류가 발생할수 있음 40.26이 16진수로 4221 a3d 인데... %04X를 안하면 4221a3d로 표시된다. 결과화면 추가 sprintf_s 를 사용 하여 해결할수 있다.
결과 화면 아직 C 언어와 친숙하지 않다면, 씹어먹는 C 언어 강좌를 보는 것이 어떻까요? #include <stdio.h> // C++ 에서는 <cstdio> int sprintf(char* str, const char* format, ...); str 에 데이터를 형식에 맞추어 쓴다. str 가 가리키는 배열에 형식 문자열에 지정한 방식 대로 C 문자열을 쓴다. 쉽게 설명하자면, printf 에서 화면에 출력하는 대신에 화면에 출력할 문자열을 인자로 지정한 문자열에 쓴다는 것이다. 이 때, 인자로 지정한 배열의 크기는 배열에 쓰여질 문자열의 크기 보다 커야만 한다. 주의할 점은 sprintf 함수는 자동적으로 str 맨 마지막에 NULL 문자를 붙이기 때문에 항상 한 칸의 여유가 있어야 한다. str C 문자열이 저장될
위 str 에 쓰여질 문자열을 포함하는 형식 문자열으로, 이는 형식 태그를 포함할 수 있다. 이 때, 형식 태그는 부수적 인자로 지정한 데이터와 치환되어 쓰여지게 된다. 이 때, 데이터가 치환되는 방식은 형식 태그에 의해 좌우된다. 따라서 부수적 인자의 개수는 적어도 형식 문자열에 사용된 형식 태그의 수 보다 많아야 한다. 형식 태그는 아래와 같이 생겼다. %[플래그(flag)][폭(width)][.정밀도][크기(length)]서식 문자(specifier) 이 때 서식 문자(specifier) 는 대응하는 인자를 어떠한 형태로 표현할지를 결정하는데에 가장 중요한 역할을 한다.
위 서식 문자를 이용한 다양한 출력 형태는 아래와 같다. #include <stdio.h> int main() { int integer = 123; char character = 'c'; char string[] = "hello, world"; int* pointer = &integer; double pi = 3.141592; char buf[100]; sprintf(buf, "integer : (decimal) %d (octal) %o \n", integer, integer); printf("%s \n", buf); sprintf(buf, "character : %c \n", character); printf("%s \n", buf); sprintf(buf, "string : %s \n", string); printf("%s \n", buf); sprintf(buf, "pointer addr : %p \n", pointer); printf("%s \n", buf); sprintf(buf, "floating point : %e // %f \n", pi, pi); printf("%s \n", buf); sprintf(buf, "percent symbol : %% \n"); printf("%s \n", buf); return 0; } 출력 결과 형식 태그에는 위 말고도 플래그, 폭, .정확도, 제한자(modifier), 부-서식문자(sub-specifiers) 에 관련한 정보들이 포함될 수 있다. 먼저 플래그를 살펴보면 플래그는 기본적으로 출력되는 형태에 대해 조금 더 자세하게 지정할 수 있게 해준다. 플래그는 아래와 같다.
폭은 말그대로 출력되는 데이터의 폭을 지정해준다. 참고로 여기서의 폭(width)은 뒤에 나오는 길이(length) 와는 완전히 다른 개념이므로 유의 하시기 바란다.
/* 사용 예 */ #include <stdio.h> int main() { FILE *fp = fopen("output.txt", "w"); char buffer[100]; int i = 123; int j = -123; double f = 3.141592; sprintf(buffer, "폭 맞추기 \n"); fputs(buffer, fp); sprintf(buffer, "i : %6d \n", i); fputs(buffer, fp); sprintf(buffer, "i : %7d \n", i); fputs(buffer, fp); sprintf(buffer, "i : %2d \n\n", i); fputs(buffer, fp); sprintf(buffer, "왼쪽 정렬 \n"); fputs(buffer, fp); sprintf(buffer, "i : %5d끝 \n", i); fputs(buffer, fp); sprintf(buffer, "오른쪽 정렬 \n"); fputs(buffer, fp); sprintf(buffer, "i : %-5d끝 \n\n", i); fputs(buffer, fp); sprintf(buffer, "# 문자의 사용 \n"); fputs(buffer, fp); sprintf(buffer, "i : %#x \n", i); fputs(buffer, fp); sprintf(buffer, "i : %#X \n\n", i); fputs(buffer, fp); sprintf(buffer, "부호 붙이기 \n"); fputs(buffer, fp); sprintf(buffer, "%+d, %+d \n", i, j); fputs(buffer, fp); return 0; } 출력결과 파일에 쓰여진 모습 정밀도는 말그대로 수치 데이터를 출력할 때 어떠한 정밀도로 출력하는지 (즉, 몇 자리 까지 출력해야 되는지) 를 지정해준다. 참고적으로 정밀도를 나타낼 때, 앞에 꼭 마침표(.) 을 찍는 것을 잊지 말기 바란다. 마침표를 찍는 이유는 앞에 폭과 구분을 하기 위해서 이다.
길이는 출력하는 데이터의 정확한 크기를 지정하는데 사용된다. 예를 들어서
/* 사용 예 */ #include <stdio.h> int main() { double f = 3.141592; int i = 12345; char buffer[100]; sprintf(buffer, "f : %.3f \n", f); printf("buf: %s \n", buffer); sprintf(buffer, "i : %.10d \n", i); printf("buf : %s \n", buffer); return 0; } 출력 결과 형식 문자열에 따라 함수는 여러 인자들을 가지며, 각 인자는 형식 문자열의 각 형식 태그에 순차적으로 대응된다. 기본적으로 형식 문자열에 들어 있는 형식 태그의 수와 뒤따라 붙는 인자들의 수는 같아야 한다. (물론 sprintf 함수를 잘 이용하면 수를 손쉽게 문자열로 바꿀 수 있다. 바로 다음과 같이. #include <stdio.h> int main() { int i; char str[100]; scanf("%d", &i); sprintf(str, "%d", i); printf("str : %s \n", str); return 0; } 실행 결과
str 에 쓰기가 성공할 경우 쓰여진 총 문자의 개수가 반환된다. 이 때, 이 문자의 개수는 맨 마지막에 자동적으로 붙는
/* sprintf 함수 예제 이 예제는 http://www.cplusplus.com/reference/clibrary/cstdio/sprintf/ 에서 가져왔습니다. */ #include <stdio.h> int main() { char buffer[50]; int n, a = 5, b = 3; n = sprintf(buffer, "%d plus %d is %d", a, b, a + b); printf("[%s] is a %d char long string\n", buffer, n); return 0; } 실행 결과
|