(Часть этого ответа является самоуверенным. Извините. У меня есть мнения.)
scanf
действительно не идеальный инструмент для точной проверки ввода. В частности, тот факт, что он обычно не различает символы новой строки и другие пробелы, делает действительно очень трудным проверку строго линейно-ориентированного ввода.
С другой стороны, если у вас есть вся эта пунктуация, возможно, вы должны быть готовы принять более произвольный ввод. Почему пользователь не должен вводить данные в две строки или даже в пять строк:
{
1,
2,
3
}
(или питонски:
{ 1
, 2
, 3
}
:-))
Если вы не пойдете на все, чтобы запретить их, или не воспользуетесь обходным решением fgets/sscanf
, обычно предлагаемым здесь, все вышеперечисленное будет принято. Что может сделать какого-то пользователя счастливым, вы никогда не знаете.
Однако есть еще одна проблема, которую, возможно, стоит попытаться решить. Здесь вы хотите убедиться, что тройка правильно завершена закрывающей скобкой }
, и вы не можете сделать это, просто вставив }
в шаблон. Если вам нужно проверить символ, который появляется после последнего преобразования, вам нужно сделать этот символ преобразованием (чтобы оно стало последним преобразованием). В противном случае scanf
просто оставит несопоставленный входной символ во входном потоке и сообщит, что все преобразования данных были успешными.
Так что вы можете использовать что-то вроде этого:
int a,b,c;
char brace;
if (scanf("{ %d , %d , %d %c", &a, &b, &c, &brace) != 4
|| brace != '}') {
printf("Bad format");
}
Это гарантирует, что существует }
, которому, возможно, предшествует пробел. Тем не менее, это
не гарантирует, что }
является последним в строке. Поскольку он не пропускает пробелы после шаблона, вы можете проверить, что остальная часть строки пуста, прочитав ее с помощью fgets
(которая будет читать до включающего символа новой строки, включая завершающий символ новой строки), а затем проверив символы, прочитанные для убедитесь, что все они удовлетворяют isspace()
.
Или вы можете просто позволить пользователю ставить переводы строк, где они захотят.