[C] printf, scanf계열
%p == %#x
%2x 2자리 출력. 빈칸일 경우 공백으로 채움
%02x 2자리 출력. 빈칸일 경우 0으로 채움
%u unsigned type 출력. 기본은 int
%h short 출력. h 한 개 붙일 때 마다 1/2씩 감소.
%hhu uint8_t 출력
%hhx uint8_t 16진수 출력
```
- ``c scanf()`` 쓸 때 마지막 개행문자가 버퍼에 남지 않을 수 있도록 format string 끝에 ``c \n``을 적어주는 것이 좋다.
- 표준 함수에서 BOF를 예방하는 법은 ``c %100s`` 같이 사용하는 것. ( 입력을 100개의 char로 제한. )
- ``c scanf()``는 다양한 형식을 입력받아야 할 때 사용하고, 단순히 문자열을 입력 받는 함수가 필요하다면 ``c fget()``를 사용하는 편이 좋다.
sprintf / snprintf
```c
snprintf(filemaps, size, "/proc/%d/maps", pid);
```
바로 변수를 문자열에 붙여 출력 가능해서 strcat같은 걸로 변수 붙여 문자열 만들 필요가 없다.
sscanf
sscanf(input, "%|x-%*|x %*s *s %s", &output1, output5);
fscanf(fp, "%s %*s %*s %s %*s %*s", parsed_ip, mac_str);
```
input에서 형식대로 데이터를 파싱해서 output에 저장하고 싶을 때.
``c %*s``처럼 ``c *``이 붙어 있으면 해당 항목은 파싱 안하겠다는 뜻.
scanf
어 어 어[탭]23[탭]010 0000 0000[엔터] 를 입력으로 받고 싶다면 다음과 같이 쓰면 된다.
```c
scanf("%[^\t]\t%s\t%[^\n]\n", name, age, num);
```
``c %[^x]``는 `` x``가 나오기 전까지 문자열로 받겠다는 표시다. ``c %s`` 대신 사용하면 된다.
``c %[^\t]`` : 탭 문자가 나오기 전까지 문자열로 받겠다는 표시.
``c %[^\n]`` : 엔터가 나오기 전까지 문자열로 받겠다는 표시.
* VS에서는 ``c scanf_s()``같은게 있는데, 사실 이게 표준은 아니다. 표준은 그냥 ``c scanf()``를 사용하도록 되어있다.
```c
#pragma warning (disable:4996)
```
'Languages & Frameworks > C C++' 카테고리의 다른 글
exec 계열 함수 (0) | 2017.05.01 |
---|---|
fork - exec / wait +clone (0) | 2017.05.01 |
Assembly (0) | 2016.11.18 |
[C] atoi / strtol , sprintf : 문자열 > 숫자, 16진수 변환 (2) | 2016.11.06 |
Pointer (0) | 2016.09.14 |