Краткие итоги
1. Для представления текстовой информации в С++ используются символьные данные и строки.
2. Инициализировать строку можно как массив символов.
3. Признаком конца строки является нулевой символ.
4. Обратиться к элементу строки можно по индексу, который соответствует порядковому номеру элемента.
5. Нумерация элементов строки начинается с нуля. Размер строки определяется количеством входящих в нее символов.
6. В С++ предусмотрены различные способы ввода и вывода одиночных символов и строк. При считывании строки с клавиатуры признак конца строки добавляется автоматически.
7. Каждому символу однозначно соответствует его внутренний код.
Для работы со строками используются библиотечные функции, прототипы которых находятся в заголовочных файлах 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). | ||
ltoa | char *ltoa (long v, char *str, int baz); | преобразует длинное целое v в строку str. При изображении числа используется основание baz (2<=baz<=36). | ||
ultoa | char *ultoa (unsignedlong 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 в буквы верхнего регистра | ||
Пример 74. Программа демонстрирует работу функций из файла stdlib.h
#include "stdafx.h"
#include <windows.h>
int main()
{
SetConsoleOutputCP(1251);
char sv[]="23.547",
si[]="1234",
sl[]="-112424",
st1[15], st2[25], st3[15];
long l,t=457821;
l=atol(sl);
printf("Преобразование строки в длинное целое число = %ld\n", l);
printf("Преобразование строки в вещественное число = %f\n", atof(sv));
printf("Преобразование строки в целое число = %d\n", atoi(si));
ultoa(t,st1,10);
printf("Преобразование длинного целого числа в строку = %s\n", st1);
printf("Преобразование длинного целого числа в строку = %s\n", ultoa(t,st2,2));
printf("Преобразование длинного целого числа в строку = %s\n", ultoa(t,st3,16));
system("pause");
return 0;
}
Результат выполнения программы:
Пример 75. Программа демонстрирует работу функций из файла string.h
int main()
{SetConsoleOutputCP(1251);
char st[50],sp[100],str[20]="МАМА МЫЛА РАМУ",
si[]="qwerty",
sl[]="qwerty",
sw[]="qwertyu";
int len=0, sravn1, kol=5;
printf("Введите строку: ");
gets(st);
len=strlen(st);
printf("Длина строки = %d\n", len);
printf("Конкатенация строк: %s\n", strcat(st,"12cdb"));
sravn1=strcmp(si,sl);
printf("Сравнение строк: %s==%s результат %d\n", si,sl,sravn1);
printf("Сравнение строк: %s<%s результат %d\n", si,sw,strcmp(si,sw));
printf("Сравнение строк: %s>%s результат %d\n", sw,si,strcmp(sw,si));
printf("Копирование байтов: %s\n", strcpy(sp,st));
printf("Преобразование букв нижнего регистра в верхний: %s\n", strupr(st));
printf("Преобразование букв верхнего регистра в нижний: %s\n", strlwr(st));
printf("Копирование %d символов в другую строку: %s\n", kol, strncpy(str,st,kol));
printf("Поиск в строке первого появления символа из другой строки: %s\n", strpbrk(st,si));
printf("Поиск в строке последнего вхождения заданного символа: %s\n", strrchr(st,'d'));
system("pause");
return 0;
}
Результат выполнения программы:
Из файла <ctype.h>:
int isdigit(int); // определяет, цифра или нет
int isalpha(int); //буква
int isupper(int); //буква в верхнем регистре
int islower(int); //буква в нижнем регистре
int isspace(int);//символ – разделитель
int ispunct(int); //символ пунктуации (ни один из вышеупомянутых)
int isalnum(int); //буква или цифра
int toupper(int); //перевод в верхний регистр
int tolower(int); //перевод в нижний регистр
Пример 75. Поиск множества неповторяющихся символов строки
int main()
{
SetConsoleOutputCP(1251);
char st[80];
int i,j,flag,len;
printf("Введите строку: ");
gets(st);
len=strlen(st); //длина строки
printf("Неповторяющиеся символы строки образуют множество: ");
for (i=1; i<len; i++)
{
flag=0; //флаг проверки на совпадение
for (j=0; j<i; j++) //сравнение символа с предыдущими
if (st[i]==st[j]) flag=1;
for (j=i+1; j<len; j++) //сравнение символа с последующими
if (st[i]==st[j]) flag=1;
if (flag==0) printf("%c", st[i]);
}
cout<<'\n';
system("pause");
return 0;
}
Результат выполнения программы:
Пример 4.
/*Удаление лишних левых и внутренних пробелов в строке при выводе*/
#include "stdafx.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[]){
char st[80];
int i=0,len;
printf("Введите строку: ");
gets(st);
len=strlen(st);//длина строки
printf("Преобразованная строка: ");
//Удалены лишние пробелы слева
while (st[i++]==' ');
//Удалены лишние пробелы внутри строки
for (--i;i<len;i++)
if ((st[i]!=' ')||(st[i+1]!=' '))
printf("%c",st[i]); //если рядом два пробела
system("pause");
return 0;
}