﻿# V8013\. Incorrect format\. A different number of format items is expected\.

Анализатор обнаружил ошибку при использовании функции форматного ввода/вывода\. Количество переданных аргументов не соответствует ожидаемому согласно форматной строке\.

Рассмотрим несколько примеров, на которые анализатор выдаёт предупреждения\.

Пример N1:

```cpp
fmt.Printf("Name: %s; Age: %d", "Donald")
```

Предполагается, что в строку форматирования будут подставлены имя \(`%s`\) и возраст \(`%d`\), однако аргумент, соответствующий возрасту, отсутствует\. В результате в `stdout` выведется строка, содержащая ошибку\.

Чтобы её исправить, следующим аргументом нужно передавать возраст:

```cpp
fmt.Printf("Name: %s; Age: %d", "Donald", 13)
```

Пример N2:

```cpp
fmt.Printf("Name: %s", "Donald", 13)
```

Здесь в функцию передаётся больше аргументов, чем подразумевалось\. Для аргумента `13` нет места подстановки\. В результате в `stdout` также выведется ошибочная строка\.

Для исправления уберём лишний аргумент: 

```cpp
fmt.Printf("Name: %s", "Donald")
```

С помощью передаваемых аргументов можно задавать ширину и точность для элемента формата\. Рассмотрим пример с шириной:

```cpp
fmt.Printf("Name: %*s", "Donald")
```

Здесь отсутствует аргумент для ширины, который задан в форматной строке с помощью символа `*`\.

Для исправления нужно добавить недостающий аргумент, соответствующий ширине:

```cpp
fmt.Printf("Name: %*s", 10, "Donald")
```

Аналогичным образом анализатор предупреждает о проблемах при работе с точностью, которая задаётся с помощью комбинации символов `.*`\.

Можно явно указать индекс аргумента, который должен подставляться в конкретный элемент формата \(по аналогии с шириной и точностью\)\. Стоит отметить, что следующий номер аргумента для подстановки вычисляется, исходя из номера предыдущего аргумента подстановки \(за исключением первого аргумента\)\. Следовательно, если явно указать, что должен подставляться аргумент `n`, то следом за ним будет подставлен аргумент `n + 1`\. 

Рассмотрим пример: 

```cpp
fmt.Printf("2: %[2]s, 1: %[1]s, 3: %s", "Donald", "James", "Michael")
```

В данном случае в `stdout` будет выведено:

```cpp
2: James, 1: Donald, 3: James
```

Аргумент `"Michael"` игнорируется\. Это происходит из\-за того, что перед ним подставляется первый аргумент `%[1]s`\. Таким образом, следующим аргументом для подстановки будет второй, которому соответствует `James`\. 

Для исправления явно укажем индекс аргумента, который должен соответствовать последнему элементу формата: 

```cpp
fmt.Printf("2: %[2]s, 1: %[1]s, 3: %[3]s",
           "Donald", "James", "Michael")
```

Теперь в `stdout` будет выведена корректная строка:

```cpp
2: James, 1: Donald, 3: Michael
```

![V8013_ru/image1.png](https://import.viva64.com/docx/blog/V8013_ru/image1.png)

Вы нашли спрятанный ссееккрреетт и, возможно, успеете забрать один из ппррииззоовв\. [Подробнее](https://pvs-studio.ru/ru/rules/)\.