Лекции по проге / 11_Строки_Обработка
.pdf
Пример функции, анализирующей содержимое строки - поиск подстроки
char *strstr(const char *str,
const char *strSearch);
Находит в строке str первое вхождение подстроки strSearch. Возвращает указатель на первое вхождение подстроки в строку
// Поиск имени и отчества в ФИО
char FIO[31]= "Ivanov Ivan Ivanovich";
//Ищем первый пробел, а следом за ним идет имя и
//отчество
puts( strstr(FIO, " ") + 1 );
Ivan Ivanovich
11
Использование указателя, возвращаемого функцией
char time[] = "17:25"; |
// время |
||
char |
minute[3]; |
// минуты |
|
char |
*separator; |
// |
указатель на |
|
|
// |
разделитель |
// Выделяем минуты |
|
|
|||||
minute = strstr(time, ":"); |
// ошибка – указатель |
||||||
|
|
|
|
|
|
// |
нельзя присвоить |
|
|
|
|
|
|
||
массив |
|
указатель на символ |
// |
массиву !!!! |
|||
|
|
|
|
|
|
|
|
// Выделяем минуты
separator = strstr(time, ":"); // находим разделитель
|
указатель на символ |
|
strcpy(minute, separator + 1);// копируем все, что |
12 |
// правее разделителя |
Задание
Переписать следующий код, не используя указатель
|
|
separator |
|
char time[] = "17:25"; |
// время |
||
char |
minute[3]; |
// минуты |
|
char |
*separator; |
// |
указатель на |
|
|
// |
разделитель |
// Выделяем минуты
separator = strstr(time, ":"); // находим разделитель strcpy(minute, separator + 1); // копируем все, что // правее разделителя
13
Комбинация функций
char |
time[] = "17:25"; |
// |
время |
char |
minute[3]; |
// |
минуты |
// Выделяем минуты
strcpy( minute, strstr(time, ":") + 1 );
указатель на символ, следующий за разделителем
14
Преобразование строк в числа и наоборот (библиотека stdlib.h, stdio.h)
atof() Преобразует строку в double (alphabetical to float) atoi() Преобразует строку в int (alphabetical to integer) atol() Преобразует строку в long int (alphabetical to long) _itoa() Преобразует int в строку (integer to alphabetical) _ltoa() Преобразует long int в строку (long to alphabetical)
_gcvt() Преобразует double в строку
sprintf() Форматированное преобразование данных в строку sscanf() Форматированное преобразование строки в данные
15
Преобразование строк в числа и наоборот (библиотека stdlib.h)
char str[]= "1.2"; |
// вещественное число |
|
char buffer[21]; |
// строковой константой |
|
|
||
// Преобразование строки в число |
||
double d = atof(str); |
// d = 1.2 |
|
int |
i = atoi(str); |
// i = 1 |
// Преобразование числа в строку |
||
_itoa(i, buffer, 10); |
// 10 – десятичная |
|
puts( buffer ); |
// система счисления |
|
_gcvt(d, 5, buffer); |
// 5 – кол-во значащих |
|
puts( buffer ); |
// разрядов |
|
16 |
|
1 |
|
1.2 |
|
Преобразование строк в числа и наоборот (библиотека stdio.h)
char str[] = "1.2"; |
// число строкой |
||
char |
buffer[21]; |
|
|
float f; |
|
|
|
int |
i; |
|
|
// Преобразование строки в число |
|||
sscanf(str, "%f", &f); |
|
// f = 1.2000000 |
|
sscanf(str, "%d", &i); |
|
// i = 1 |
|
// Преобразование числа в строку |
|||
sprintf(buffer, "%d", i); |
|
||
puts( buffer ); |
|
|
|
sprintf(buffer, "%.5f", f); |
// 5 знаков после запятой |
||
puts( buffer ); |
|
1 |
|
17 |
|
|
|
|
|
1.20000 |
|
Создание строки по заданному формату
int sprintf( char *buffer, const char *format [,argument] ... );
Функция работает аналогично функции printf, но в отличие от нее результат помещается не на экран, а в строку buffer
int day = 3, month = 10, year = 2000; char buffer[21];
// Преобразование чисел в строку
sprintf(buffer, "%02d.%02d.%04d", day, month, year); |
||
puts( buffer ); |
03.10.2000 |
|
18 |
||
|
||
Чтение данных из строки по заданному формату
int sscanf( const char *buffer, const char *format [,argument] ... );
Функция работает аналогично функции scanf, но в отличие от нее данные считываются не с клавиатуры, а из строки buffer
char buffer[] = "My group size is 25 students"; int groupSize;
// Преобразование части строки в число
sscanf(buffer, "My group size is %d", &groupSize); |
||
printf( "%d", groupSize ); |
25 |
|
19 |
||
|
||
Разбиение строки
char *strtok(char *strToken,
const char *strDelimit);
Разбивает строку strToken на подстроки, ориентируясь на разделители strDelimit
Результатом однократного вызова функции является замена первого разделителя в строке на нуль-символ
Функция возвращает указатель на начало первой подстроки
|
исходная строка |
|
строка после |
20 |
однократного вызова |
|
A |
s |
t |
r |
i |
n |
g |
o |
f |
, |
, |
, |
t |
o |
k |
e |
n |
s \0 |
A \0 s |
t |
r |
i |
n |
g |
o |
f |
, |
, |
, |
t |
o |
k |
e |
n |
s \0 |
|


token
