Тщательно выполнять эту работу - нетривиальное упражнение.
То, что вы показываете, не очень хорошо подражает sscanf("%s", buffer);
. Есть как минимум две проблемы:
- Вы ограничиваете ввод до 20 символов.
- Вы не прекращаете читать первый пробел, оставляя его и другие символы позади для чтения в следующий раз.
Обратите внимание, что системные вызовы не могут обеспечить функцию unget; это должно быть обеспечено типом FILE *
. С файловыми потоками вам гарантирован один символ возврата. Недавно я провел эмпирическое исследование по пределам, обнаружив значения, в которых число сдвигаемых назад символов варьировалось от 1 (AIX, HP-UX) до 4 (Solaris) до «большого», то есть до 4 КиБ. , возможно, больше, на Linux и MacOS X (BSD). К счастью, scanf()
требует только одного символа возврата. (Ну, это обычное утверждение; я не уверен, выполнимо ли это при различении между «1.23e + f» и «1.23e + 1»; для первого нужны три символа предвкушения, как мне кажется, прежде чем он сможет сказать, что e+f
не является частью числа.)
Если вы пишете сменный модуль для scanf()
, вам нужно будет использовать механизм <stdarg.h>
. К счастью, все аргументы scanf()
после строки формата являются указателями данных, а все указатели данных имеют одинаковый размер. Это упрощает некоторые аспекты кода. Однако вы будете анализировать строку формата сканирования (само по себе нетривиальное упражнение; см. Недавнее обсуждение синтаксический анализ строки формата печати ), а затем организуете соответствующие преобразования и назначения.
Если на вас не наложены необычно строгие условия, предположим, что вы будете использовать функции стандартной библиотеки ввода-вывода на уровне символов, такие как getchar()
, getc()
и ungetc()
. Если вы даже не можете их использовать, напишите их собственные варианты. Имейте в виду, что полная интеграция с остальными функциями ввода-вывода является сложной задачей - такие вещи, как fseek()
, усложняют ситуацию, и обеспечение правильного использования символов сдвига назад также не совсем тривиально.