(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.