﻿# Работа с типом size\_t в функциях prinft, scanf и аналогичных им

Для работы с типами size\_t, ptrdiff\_t, intptr\_t, uintptr\_t в функциях типа sscanf, printf имеются спецификаторы размера\. Если вы разрабатываете Windows\-приложение, то вы можете использовать спецификатор размера "I"\.

Пример использования:

```cpp
size_t s = 1; 
printf("%Iu", s);
```

Если вы разрабатываете приложение под Linux, то вам будет доступен спецификатор размера "z"\. Пример использования:

```cpp
ptrdiff_t s = 1;
printf("%zd", s);
```

Спецификаторы хорошо описаны в статье Wikipedia "[printf](https://ru.wikipedia.org/wiki/Printf)"\.

Если вы вынуждены поддерживать переносимый код, использующий функции типа sscanf, то в формате управляющих строк можно использовать специальные макросы, раскрывающиеся в необходимые спецификаторы размера\. Пример макроса, помогающего создавать переносимый код для разных систем:

```cpp
// PR_SIZET on Win64 = "I"
// PR_SIZET on Win32 = ""
// PR_SIZET on Linux64 = "z"
// ...
size_t u;
scanf("%" PR_SIZET "u", &u);
printf("%" PR_SIZET "x", u);
```

## Библиографический список

1. Уроки разработки 64\-битных приложений на языке Си/Си\+\+\. [Урок 10\. Паттерн 2\. Функции с переменным количеством аргументов](https://pvs-studio.ru/ru/blog/lessons/0010/)\. 
1. Wikipedia\. [Printf](https://ru.wikipedia.org/wiki/Printf)\.
1. База знаний\. [Отличие %p от %x](https://pvs-studio.ru/ru/blog/posts/cpp/k0019/)\.
1. База знаний\. [Как правильно распечатать значение типа \_\_int64, size\_t и ptrdiff\_t](https://pvs-studio.ru/ru/blog/posts/cpp/k0046/)\.