카테고리 없음

U2L프로젝트 sprintf 이슈

멜번초이 2020. 10. 28. 14:14

snprintf() 함수는 타겟배열버퍼에 일련의 문자와 값의 형식을 argument로 전달하여 저장할 수 있다. 아래의 샘플 예제를 실행했을 때 Unix와 Linux 에서 결과값이 다르게 출력되는 이슈가 있다.

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

int main()
{
char str1[1024];
char buf[10];

memset(str1, 0x00, sizeof(str1));
memset(buf, 0x00, sizeof(buf));

strcpy(str1, "abcd");
strcpy(buf, "1234");

snprintf(str1, sizeof(str1), "%s%s", str1, buf);

printf("str1 [%s]\n", str1);
return 0;
}

이 프로그램을 Unix에서 수행했을 때는 abcd1234 가 출력되지만 리눅스에서 수행했을 때는 1234 가 출력된다.

리눅스에서 snprintf 는 입력값으로 사용된 argument 중 한 개의 변수가 타겟배열버퍼도 포함되어 있음으로, 유닉스에서와 다른 예상하지 못한 값을 반환하게 된다.

따라서 리눅스 프로그래밍에서는 sprintf 함수를 사용할 때 결과값을 보관하는 타겟배열버퍼는 argument와 다른 변수를 사용하도록 프로그램이 수정되어야 한다.

- 올바르지 못한 사용법
snprintf(str1, sizeof(str1), "%s%s", str1, buf );
* 입력값 str1변수가, 결과버퍼 str1 변수에도 사용되고 있음

- 올바르게 사용한 예
snprintf(str2, sizeof(str2), "%s%s", str1, buf );
* 입력값 str1변수는 결과버퍼변수와 다른 변수명 str2를 사용해야 한다.