Ошибка формата аргумента - C (СИ)
Формулировка задачи:
warning: format ‘%s’ expects argument of type ‘char *’, but argument 6 has type ‘int’ [-Wformat=]
);
^
, но 6-ой аргумент состоит из числа от 2 до 5
while (fread(&p, sizeof(p), 1, file) == 1)
{
printf("|%16s|%10s|%9s|%7d|%8s|%12d|%8d|%10d|%8d|\n",
p.fam,
p.ini,
p.pol == 'm' ? "Male" : "Female",
p.nomer,
p.gold,
p.matem,
p.fizika,
p.rus,
p.ball
);
printf("+----------------+----------+---------+-------+--------+------------+--------+----------+--------+\n");
}Решение задачи: «Ошибка формата аргумента»
textual
Листинг программы
char buf[256];
while (fgets(buf, 256, file))
{
sscanf(buf, "%s %s %c %d %c %d %d %d %d",
&p.fam,
&p.ini,
&p.pol,
&p.nomer,
&p.gold,
&p.matem,
&p.fizika,
&p.rus,
&p.ball);
printf("|%16s|%10s|%9c|%7d|%8c|%12d|%8d|%10d|%8d|\n",
p.fam,
p.ini,
p.pol,//== 'm' ? "Male" : "Female",
p.nomer,
p.gold,//== 'y' ? "Yes" : "No",
p.matem,
p.fizika,
p.rus,
p.ball);
printf("+----------------+----------+---------+-------+--------+------------+--------+----------+--------+\n");
}
Объяснение кода листинга программы
- Объявлены массив символов buf размером 256 и файл file.
- В цикле while считывается строка из файла в buf.
- Используя функцию sscanf, строку из buf разбирают на значения переменных: — p.fam (семейное положение) — p.ini (инициалы) — p.pol (пол) — p.nomer (номер) — p.gold (золото) — p.matem (математика) — p.fizika (физика) — p.rus (русский язык) — p.ball (балл)
- С помощью условного оператора sprintf, строки
MaleиFemaleзаменяются на 'm' и 'f' соответственно. - С помощью условного оператора sprintf, строки
YesиNoзаменяются на 'y' и 'n' соответственно. - С помощью функции printf выводятся значения переменных на экран.
- Дополнительно выводится разделительная строка.
- Цикл while продолжается до тех пор, пока из файла не будет считана пустая строка.