Опубликован: 02.02.2011 | Доступ: свободный | Студентов: 3378 / 987 | Оценка: 4.43 / 3.57 | Длительность: 33:06:00
Специальности: Программист
Лекция 9:

Функции для работы со строками

< Лекция 8 || Лекция 9: 123 || Лекция 10 >
Аннотация: В лекции рассматриваются библиотечные функции, предназначенные для работы со строками, и особенности их выполнения, приведены примеры использования таких функций при решении задач.

Цель лекции: изучить синтаксис и семантику стандартных функций по работе со строками, научиться использовать в программах функции для работы со строками в языке C++

Для работы со строками используются библиотечные функции, прототипы которых находятся в заголовочных файлах stdlib.h и string.h.

В программах, в зависимости от типа, вызовы функций для работы со строками задаются в виде:

ИмяФ(СписокАргументов);

или

ИмяПерем=ИмяФ(СписокАргументов);

где ИмяФимя функции; СписокАргументовсписок аргументов, передаваемых в тело функции; ИмяПеремидентификатор соответствующего типа.

Например:

y=strlen(st); 
  /*переменной y присвоить значение длины строки st*/

При использовании библиотечных функций следует учитывать некоторые особенности их выполнения и представления символьных данных в памяти.

  • Функции, работающие с регистрами, распространяются только на латиницу.
  • В С++ некоторые параметры функций обработки символов принадлежат типу int (unsigned), поэтому, если число станет больше 128 (255), функция будет работать некорректно.
  • Перед первым обращением к строке она должна быть объявлена и проинициализирована. Во многих случаях в качестве начального значения строки необходимо бывает задать пустую строку. Такую инициализацию можно выполнить с помощью вызова функции strcpy(s, "");, но более эффективным будет присваивание *s=0;. Кроме того пустую строку можно инициализировать char s[10]=""; или char s[10]="\0";, но при этом размер строки должен быть задан.
  • Функции копирования (кроме strncpy ) не проверяют длину строки. Размер строки-приемника должен быть больше, чем размер источника на 1 символ (для символа '\0' ).

При вызове функции strncpy следует помнить, что, если длина копируемой строки превосходит параметр kol, то строка-получатель не будет завершена символом '\0'. В этом случае такой символ надо дописывать в конец строки вручную.

Функции для работы со строками – файл stdlib.h
Функция Прототип Краткое описание действий
atof double atof (const char *str); преобразует строку str в вещественное число типа double
atoi int atoi (const char *str); преобразует строку str в целое число типа int
atol long atol (const char *str); преобразует строку str в целое число типа long
itoa char *itoa (int v, char *str, int baz); преобразует целое v в строку str. При изображении числа используется основание baz (2<=baz<=36). Для отрицательного числа и baz =10 первый символ "минус" (–).
ltoa char *ltoa (long v, char *str, int baz); преобразует длинное целое v в строку str. При изображении числа используется основание baz (2<=baz<=36).
ultoa char *ultoa (unsigned long v, char *str, int baz); преобразует беззнаковое длинное целое v в строку str
Функции для работы со строками – файл string.h
Функция Прототип Краткое описание действий
strcat char *strcat (char *sp, const char *si); приписывает строку si к строке sp (конкатенация строк)
strchr char *strchr (const char *str, int c); ищет в строке str первое вхождение символа с
strcmp int strcmp (const char *str1, const char *str2); сравнивает строки str1 и str2. Результат отрицателен, если str1<str2 ; равен нулю, если str1==str2, и положителен, если str1>str2 (сравнение беззнаковое)
strcpy char *strcpy (char *sp, const char *si); копирует байты строки si в строку sp
strcspn int strcspn (const char *str1, const char *str2); определяет длину первого сегмента строки str1, содержащего символы, не входящие во множество символов строки str2
strdup char *strdup (const char *str); выделяет память и переносит в нее копию строки str
strlen unsigned strlen (const char *str); вычисляет длину строки str
strlwr char *strlwr (char *str); преобразует буквы верхнего регистра в строке в соответствующие буквы нижнего регистра
strncat char *strncat (char *sp, const char *si, int kol); приписывает kol символов строки si к строке sp (конкатенация)
strncmp int strncmp (const char *str1, const char *str2, int kol); сравнивает части строк str1 и str2, причем рассматриваются первые kol символов. Результат отрицателен, если str1<str2 ; равен нулю, если str1==str2, и положителен, если str1>str2
strncpy char *strncpy (char *sp, const char *si, int kol); копирует kol символов строки si в строку sp ("хвост" отбрасывается или дополняется пробелами)
strnicmp int strnicmp (char *str1, const char *str2, int kol); сравнивает не более kol символов строки str1 и строки str2, не делая различия регистров (см. функцию strncmp )
strnset char *strnset (char *str, int c, int kol); заменяет первые kol символов строки str символом c
strpbrk char *strpbrk (const char *str1, const char *str2); ищет в строке str1 первое появление любого из множества символов, входящих в строку str2
strrchr char *strrchr (const char *str, int c); ищет в строке str последнее вхождение символа с
strset char *strset (char *str, int c); заполняет строку str заданным символом c
strspn int strspn (const char *str1, const char *str2); определяет длину первого сегмента строки str1, содержащего только символы, из множества символов строки str2
strstr char *strstr (const char *str1, const char *str2); ищет в строке str1 подстроку str2. Возвращает указатель на тот элемент в строке str1, с которого начинается подстрока str2
strtod double strtod (const char *str, char **endptr); преобразует символьную константу str в число двойной точности. Если endptr не равен NULL, то *endptr возвращается как указатель на символ, при достижении которого прекращено чтение строки str
strtok char *strtok (char *str1, const char *str2); ищет в строке str1 лексемы, выделенные символами из второй строки
strtol long strtol (const char *str, char **endptr, int baz); преобразует символьную константу str к значению "длинное число" с основанием baz (2<=baz<=36). Если endptr не равен NULL, то *endptr возвращается как указатель на символ, при достижении которого прекращено чтение строки str
strupr char *strupr (char *str); преобразует буквы нижнего регистра в строке str в буквы верхнего регистра

Сравнение строк с помощью функции strcmp осуществляется побайтово в лексикографическом порядке, то есть в порядке следования соответствующих байтов строк в таблице кодировки. Именно поэтому значения элементов в строках зависят от регистра.

При использовании библиотечных функций следует иметь в виду, что указатель на строку и имя массива символов указывают на адрес размещения строки в памяти. Это означает, что изменения значений элементов строки сохраняются после завершения работы функции. Чтобы не допустить изменений в строке используется указатель на константу, который не позволит модифицировать данные, хранящиеся по адресуемой области памяти.

Пример 1.

//Программа демонстрирует работу функций из файла stdlib.h 
#include "stdafx.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[]){
  char sv[]="23.547",
       si[]="1234",
       sl[]="-112424",
       st1[15],st2[25],st3[15];
  double v;
  int i;   
  long l,t=457821;
      
  v=atof(sv); 
  printf("Преобразование строки в вещественное число = %f\n",v);
  i=atoi(si); 
  printf("Преобразование строки в целое число = %d\n",i);
  l=atol(sl); 
  printf("Преобразование строки в длинное целое число = %ld\n",l);
  printf("Преобразование длинного целого числа в строку = %s\n",
         ultoa(t,st1,10));
  printf("Преобразование длинного целого числа в строку = %s\n",
         ultoa(t,st2,2));
  printf("Преобразование длинного целого числа в строку = %s\n",
          ultoa(t,st3,16));
  system("pause");
  return 0;
}
< Лекция 8 || Лекция 9: 123 || Лекция 10 >
Денис Курбатов
Денис Курбатов
Владислав Нагорный
Владислав Нагорный

Подскажите, пожалуйста, планируете ли вы возобновление программ высшего образования? Если да, есть ли какие-то примерные сроки?

Спасибо!