Post

(C) printf, scanf계열

1
2
3
4
5
6
7
8
%p == %#x
%2x        2자리 출력. 빈칸일 경우 공백으로 채움
%02x       2자리 출력. 빈칸일 경우 0으로 채움
%u         unsigned type 출력. 기본은 int
%h         short 출력. h   붙일  마다 1/2 감소.
%hhu       uint8\_t 출력
%hhx       uint8\_t 16진수 출력

  • scanf() 쓸 때 마지막 개행문자가 버퍼에 남지 않을 수 있도록 format string 끝 에\n 을 적어주는 것이 좋다.
  • 표준 함수에서 BOF를 예방하는 법은 %100s 같이 사용하는 것. ( 입력을 100개의 char로 제한. )
  • scanf()는 다양한 형식을 입력받아야 할 때 사용하고, 단순히 문자열을 입력 받는 함수가 필요하다면 fget()를 사용하는 편이 좋다.
sprintf / snprintf
1
2
snprintf(filemaps, size, "/proc/%d/maps", pid);

바로 변수를 문자열에 붙여 출력 가능해서 strcat같은 걸로 변수 붙여 문자열 만들 필요가 없다.

sscanf
1
2
3
sscanf(input, "%|x-%\*|x %\*s \*s %s", &output1, output5);
fscanf(fp, "%s %\*s %\*s %s %\*s %\*s", parsed\_ip, mac\_str);

input에서 형식대로 데이터를 파싱해서 output에 저장하고 싶을 때. %\*s처럼 \*이 붙어 있으면 해당 항목은 파싱 안하겠다는 뜻.

scanf

어 어 어[탭]23[탭]010 0000 0000[엔터] 를 입력으로 받고 싶다면 다음과 같이 쓰면 된다.

1
2
scanf("%[^\t]\t%s\t%[^\n]\n", name, age, num);

%[^x]x가 나오기 전까지 문자열로 받겠다는 표시다. %s 대신 사용하면 된다. %[^\t] : 탭 문자가 나오기 전까지 문자열로 받겠다는 표시. %[^\n] : 엔터가 나오기 전까지 문자열로 받겠다는 표시.

* VS에서는 scanf\_s()같은게 있는데, 사실 이게 표준은 아니다. 표준은 그냥 scanf()를 사용하도록 되어있다.

1
2
#pragma warning (disable:4996)

This post is licensed under CC BY 4.0 by the author.