int fscanf(FILE *stream, const char *format, ...);
int sscanf(const char *s, const char *format, ...);
Очень важно, чтобы переменные, используемые для хранения значений, считываемых функциями scanf
Строка format
scanf и других функций этого семейства, как и в случае функции printf, содержит как обычные символы, так и спецификаторы преобразований. Но обычные символы применяются для задания символов, которые должны присутствовать во вводе.Рассмотрим простой пример:
int num;
scanf("Hello %d", #);
Вызов функции scanf
Hello. Затем, если следующие символы формируют распознаваемое десятичное число, оно будет считано и присвоено переменной num. Пробел в строке формата при вводе применяется для игнорирования во вводном файле всех пробельных символов (пробелы, табуляции, переводы страницы и переходы на новую строку) между спецификаторами преобразований. Это означает, что вызов, scanf будет успешным и поместит 1234 в переменную num в случае следующих двух вариантов ввода.Hello 1234
Hellol234
Пробельные символы обычно игнорируются во вводе, когда начинается преобразование. Это означает, что строка формата %d
Если не соблюдать осторожность, могут возникнуть проблемы. В вашей программе может появиться бесконечный цикл, если во вводе оставить нецифровой символ при считывании целых чисел.
К другим спецификаторам преобразований относятся следующие:
%d — считывание десятичного целого;%o, %x — считывание восьмеричного, шестнадцатеричного целого;%f, %e, %g — считывание числа с плавающей запятой;%c — считывание символа (пробельный символ не пропускается);%s
%[]
%%
%.Как и в случае printf
scanf есть ширина поля, ограничивающая объем ввода. Спецификатор размера (h для коротких или l для длинных целых) показывает, короче или длиннее стандартного получаемый аргумент. Таким образом, %hd обозначает число типа short int, %ld — число типа long int и %lg — число с плавающей точкой двойной точности.Спецификатор, начинающийся со звездочки, указывает на то, что элемент игнорируется. Это значит, что информация не сохраняется, и, следовательно, для ее получения не нужна переменная.
Применяйте спецификатор %c
Используйте спецификатор %s
Лучше применять спецификатор ширины поля или комбинацию функций fgets
sscanf для считывания строки ввода, а затем просматривать ее. Это защитит от возможных переполнений буфера, которые может спровоцировать злонамеренный пользователь.Применяйте спецификатор %[]
%[A-Z] будет читать строку из прописных букв латинского алфавита. Если в множестве первый символ — знак вставки (^), то спецификатор считывает строку, состоящую из символов, не входящих в множество. Итак, для того чтобы прочитать строку с пробелами, но остановиться на первой запятой, примените спецификатор %[^, ].Если задана следующая строка ввода:
Hello, 1234, 5.678, X, string to the end of the line
приведенный далее вызов scanf
char s[256];
int n;
float f;
char c;
scanf("Hello, %d, %g, %c, %[^\n]", &n, &f, &c, s);