Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лекции по проге / 11_Строки_Обработка

.pdf
Скачиваний:
30
Добавлен:
14.03.2016
Размер:
204.95 Кб
Скачать

Пример функции, анализирующей содержимое строки - поиск подстроки

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