Когда вы вводите "c P101
", программа фактически получает "c P101\n
". Большинство спецификаторов преобразования пропускают первые пробелы, включая переводы строк, но %c
этого не делает. Первый раз, когда все до тех пор, пока не будет прочитано "\n
", второй раз, когда "\ n" будет прочитано в command
, "c
" прочитано в prefix
и "P
" слева, который не является числом, поэтому преобразование завершается неудачно, и "P101\n
" остается в потоке. В следующий раз, когда «P
» будет сохранено в команде, «1
» будет сохранено в префиксе, а 1
(из оставшихся «01
») будет сохранено на входе, а «\n
» все еще включено поток в следующий раз. Вы можете решить эту проблему, поставив пробел в начале строки формата, который пропустит все начальные пробелы, включая символы новой строки.
Аналогичная вещь происходит во втором случае, когда вы вводите "q
", "q\n
" вводится в поток, первый раз, когда читается "q
", второй раз, когда «\n
» читается, только при третьем вызове происходит второе чтение «q
», вы можете избежать этой проблемы снова, добавив пробел в начале строки формата.
Лучший способ сделать это - использовать что-то вроде fgets () для одновременной обработки строки, а затем использовать sscanf () для анализа.