Проблема в том, что %*s
съедает число на следующей строке, когда нет третьего столбца, а затем следующий %d
терпит неудачу, потому что следующий токен не является числом. Чтобы исправить это без использования gets()
, за которым следует sscanf()
, вы можете использовать указанный класс символов:
while(scanf("%d %s%*[^\n]", &num, &word) == 2)
{
assign stuff
}
[^\n]
говорит, что должно соответствовать как можно большему числу символов, которые не являются символами новой строки, а *
подавляет назначение, как и раньше. Также обратите внимание, что вы не можете поместить пробел между %s
и %*[\n]
, потому что в противном случае этот пробел в строке формата будет совпадать с новой строкой, в результате чего %*[\n]
будет соответствовать всей последующей строке, а это не то, что ты хочешь.