Функция sscanf считывает данные из строки (массива символов) в переменные. Функция имеет следующий синтаксис
int sscanf (const char * buffer, const char * format, …);
Первый параметр функции представляет строку, из которой считываются данные. Второй параметр представляет формат считывания. В качестве последующих параметров указываются переменные, в которые идет считывание.
Считаем данные из строки
#include <stdio.h>
int main(void)
{
char buff[50] = "F 69 123.45";
char c;
int n;
double d;
sscanf(buff, "%c %d %lf", &c, &n, &d);
printf("Values: %c, %d, %lf\n", c, n, d);
return 0;
}
В данном случае строка, из которой считываются данные:
"F 69 123.45"
Разделителем между значениями является пробел, либо последовательность пробелов, табуляция и перевод строки.
Эту строку передаем в функцию sscanf первым аргументом и считываем ее значения в переменные c, n, d:
А второй аргумент - формат считывания определяет, как данные из строки будут сопоставляться с переменными:
"%c %d %lf"
Поскольку значения в строке buff разделены пробелами, то и в строки форматирования спецификаторы разделены пробелами. Первый спецификатор %c позволяет считать первый символ в переменную типа char
c.
Второй спецификатор - %d обеспечивает считывание целого числа в переменную n.
И третий спецификатор %lf считывает данные в переменную типа double - d
То есть в итоге консольный вывод был бы следующим:
Values: F, 69, 123.450000
Обратите внимание, что формат считывания соответствует строке, из которой считываются данные. Если бы в строке данные были бы разделены запятыми, то спецификаторы в формате считывания также были бы разделены запятыми:
#include <stdio.h>
int main(void)
{
char buff[50] = "F, 69, 123.45";
char c;
int n;
double d;
sscanf(buff, "%c, %d, %lf", &c, &n, &d);
printf("Values: %c, %d, %.2lf\n", c, n, d);
return 0;
}
Еще один пример. Пусть в строке содержатся данные пользователя, как имя, возраст, зарплата. Считаем эти данные в переменные:
#include <stdio.h>
int main(void)
{
char buff[50] = "Tom 23 505.99";
char name[10];
int age;
double salary;
sscanf(buff, "%s %d %lf", name, &age, &salary);
printf("Name: %s \tAge: %d \tSalary: %.2lf\n", name, age, salary);
return 0;
}
Причем строка форматирования может быть более сложной. Например:
#include <stdio.h>
int main(void)
{
char *buff = "Name is Tom and age is 38";
char name[10];
int age;
sscanf(buff, "Name is %s and age is %d", name, &age);
printf("Name: %s \tAge: %d\n", name, age); // Name: Tom Age: 38
return 0;
}
В данном случае исходная строка представляет текст "Name is Tom and age is 38". И на эту строку накладывается строка форматирования
"Name is %s and age is %d". Соответственно здесь спецификатор %s будет представлять строку "Tom", а спецификатор %d -
число 38.
Комбинируя это функцию с fgets(), можно считывать данные с консоли:
#include <stdio.h>
int main(void)
{
char buff[50];
char name[10];
int age;
double salary;
printf("Enter the data\n");
if(!fgets(buff, 50, stdin))
{
printf("Fatal Error!\n");
return 1;
}
sscanf(buff, "%s %d %lf", name, &age, &salary);
printf("Name: %s \tAge: %d \tSalary: %.2lf\n", name, age, salary);
return 0;
}
Пример консольного ввода:
Enter the data Tom 38 456.78 Name: Tom Age: 38 Salary: 456.78
Данный способ имеет премущества по сравнению с чтением через scanf, поскольку при считывании функция
scanf удаляет из входного буфера только значения, которые соответствуют спецификаторам. Поэтому, если ввод через
scanf не соответствует чему-либо, оставшиеся в буфере символы будут считываться при следующем вызове scanf.
Функция sprintf производит обратное действие - записывает данные в строку:
int sprintf(char *_Buffer, const char *_Format, ...)
В качестве первого параметра функция принимает указатель на буфер, в который идет запись. Второй параметр представляет строку форматирования. Кроме того, в качестве дополнеительных аргументов в функцию можно передавать дополнительные значения для спецификаторов из строки форматирования. Результатом функции является длина количество записанный символов плюс нулевой символ.
Пример использования:
#include <stdio.h>
void main (void)
{
int age = 38;
char* name = "Tom";
char text[50];
int charNumber = sprintf (text, "Name: %s Age: %d\n", name, age);
printf (text); // Name: Tom Age: 38
printf("text length: %d", charNumber); // text length: 19
}
В данном случае в переменную text записывается строка "Name: %s Age: %d\n", в которую вместо спецификаторов подставляются значения переменных
name и age.