```c

%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

```c

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] printf, scanf계열  (0) 2016.11.10
[C] atoi / strtol , sprintf : 문자열 > 숫자, 16진수 변환  (2) 2016.11.06
Pointer  (0) 2016.09.14