Читайте также:
|
|
Рассмотрим некоторые типичные функции стандартной библиотеки string.h. Это библиотека обработки строк, которая обеспечивает много полезных функций для работы со строковыми данными, например, сравнение строк, поиск в строках нужных символов и других подстрок, разметку строк (разделение строк на логические куски) и определение длины строки.
1. Функция
int strlen (const char * s);
Определяет длину строки s. Возвращает количество символов, предшествующих завершающему нулевому символу. Обратите внимание, завершающий ноль-символ в длину не включается. Например,
cout << strlen ("Hello!"); // на экране будет 6 char * str ="one"; cout << strlen (str); // на экране будет 32. Функция
char * strcpy (char * s 1, const char * s 2);
Копирует строку s 2 в массив символов s 1. Возвращает значение s 1. Массив символов s 1 должен быть достаточно большим, чтобы хранить строку и ее завершающий нулевой символ, который также копируется. Например,
char str [25]; // объявляем символьный массив из 25 элементов char * ps = new char [25]; /* объявляем указатель на символ и динамически выделяем память под 25 символов */ strcpy (str, "ABCDE"); // копируем в str строковую константу "ABCDE" cout << str; // выводим str на экран. На экране будет ABCDE strcpy (ps, "QWERTY"); // копируем в ps строковую константу "QWERTY" cout << ps; // выводим ps на экран. На экране будет QWERTY delete [] ps; // освобождаем памятьОбратите внимание, если надо, чтобы одна строка содержала другую, нужно скопировать ее содержимое, а не присвоить! Так, например, в данном случае инструкция ps ="QWERTY" была бы ошибочна. Компилятор, встречая такую инструкцию, создают строку "QWERTY", за которой следует нулевой символ и присваивает значение начального адреса этой строки (адреса символа Q) переменной ps. Таким образом, теряется исходное значение ps, а значит невозможно корректно освободить память под ps.
3. Функция
int * strcmp (const char * s 1, const char * s 2);
Сравнивает строки s 1 и s 2 (по ASCII-кодам). Функция возвращает значение 0, если строки s 1 и s 2 равны, значение меньше нуля, если строка s 1 меньше s 2, и значение больше нуля, если s 1 больше s 2. Обратите внимание, строки сравниваются не по длине, а посимвольно, по ASCII-кодам (т.е. "g" больше "ff"). Например,
4. Функция
char * strcat (char * s 1, const char * s 2);
Добавляет строку s 2 к строке s 1. Первый символ строки s 2 записывается поверх ноль-символа строки s 1. Возвращает s 1. Под s 1 должно быть выделено памяти не меньше чем (strlen (s 1)+ strlen (s 2)+1). Например,
char st1 [25] = "День"; cout << strcat (st1, " добрый!"); // на экране будет День добрый!5. Функция
char * strncpy (char * s 1, const char * s 2, int n);
Копирует не более n символов строки s 2 в массив символов s 1. Возвращает s 1.
6. Функция
int * strncmp (char * s 1, const char * s 2, int n);
Сравнивает до n символов строки s 1 со строкой s 2. Возвращает 0, меньше, чем 0 или больше, чем 0, если s 1 соответственно равно, меньше или больше s 2.
7. Функция
char * strncat (char * s 1, const char * s 2, int n);
Присоединяет первые n символов строки s 2 к строке s 1. Возвращает s 1.
8. Функция
char * strchr (const char * s, char c);
Проверяет строку s на содержание символа хранящегося в c. Результатом функции является адрес первого вхождения символа c в строку s, то есть возвращается строка, которая начинается от первого вхождения заданного символа до конца строки s. Если символ не найден, возвращается NULL. Применяется в выражениях. Например,
char str [20]="ABCDEXYZ"; cout << strchr (str, 'X'); // на экране будет XYZили
char str [20]="ABCDEXYZ"; if (strchr (str, 'q') == NULL) cout <<"Нет такого символа!";9. Функция
char * strstr (const char * s 1, const char * s 2);
Проверяет строку s 1 на содержание подстроки s 2. Результатом функции является адрес первого вхождения подстроки s 2 в строку s 1. Если подстрока не найдена, возвращается NULL. Например,
char str [20]="ABCDEXYZ"; char * ps = strstr (str, "DEX"); if (ps!= NULL) cout << ps; // На экране будет DEXYZ else cout <<"Нет такой подстроки!";10. Функция
char * strlwr (char * s);
Конвертирует строку к нижнему регистру (т.е. переводит строку в строчные символы). Например,
char str [30] = "ABCDE_123_ijk_XYZ"; cout << strlwr (str); // на экране будет abcde_123_ijk_xyz11. Функция
char * strupr (char * s);
Конвертирует строку к верхнему регистру (т.е. переводит строку в прописные символы).
12. Функция
char * strset (char * s, char ch);
Заменяет ВСЕ символы в строке s на символ ch. Например,
char str [30] = "ABCDE"; cout << strset (str, 'x'); // на экране будет xxxxx13. Функция
char * strnset (char * s, char ch, int n);
Заменяет первые n символов в строке s на символ ch.
14. Функция
char * strrev (char * s);
Меняет порядок следования символов в строке на противоположный (меняет первый символ с последним, второй символ с предпоследним и т.д.). Например,
char str [30] = "12345"; cout << strrev (str); // на экране будет 54321Типичная ошибка программирования. Необходимо включить заголовочный файл string. h при использовании функций из библиотеки обработки строк.
Также ознакомимся с двумя функциями, которые могут помочь программисту при чтении символов с клавиатуры:
Функция
int getch (void);
Возвращает ASCII-код нажатой клавиши.
Функция
int getche (void);
Возвращает ASCII-код нажатой клавиши и выводит символ на экран.
Прототипы последних двух функций описаны в файле conio. h, который входит в стандартную библиотеку языка С++.
Работа со строками в С++. Примеры.
Пример 4.
Задача. Дана строка символов, подсчитать сколько раз среди символов строки встречается буква x.
#include <iostream.h>void main(void){ char str[100]; // объявление строки символов cout<<"\nVvedite stroky: "; // просим пользователя ввести строку символов cin >> str; // считываем строку, введенную пользователем int count = 0; /* объявление переменной-счетчика, в которой будем хранить количество вхождений х в строку */ int i = 0; while(str[i]!='\0') { if (str[i]=='x') count++; i++; } cout<<"\n Simvol x vxodit v stroky –"<<count; // выводим результат на экран}Пример 5
Задача. Написать программу, которая получает от пользователя набор символов, исключая пробел, и удаляет из этого набора все вхождения символов S и s.
Наибольший интерес представляет анализ строки. Для реализации этого анализа нужно поэлементно двигаться от нулевого индекса массива к последнему и делать проверку каждого элемента. Если будет встречен такой элемент с индексом i, то нам нужно сместить все элементы с индексами, большими чем i, на один индекс меньше. Другими словами:
Пускай дана следующая строка: A b s D e f
0 1 2 3 4 5 ------ индексыПроверяя поиндексно каждый элемент массива, видим, что 2 элемент массива и есть искомый символ. Тогда, нужно сместить каждый элемент массива на 1 индекс меньше, т.е. получить следующий результат: A b D e f
0 1 2 3 4#include <iostream.h>void main(){ const int CharCount=10; //зададим размерность массива через константу char arr[CharCount]; //объявление символьного массива //Предупредим пользователя, что ввод ограничен размерностью массива cout<<"\nVvedite stroky, no ne bolee, chem "<<CharCount-1<<" simvolov\n"; cin >> arr; // ввод строки int i=0; while (arr[i]!='\0') //Цикл работает пока не встретится признак конца строки if (arr[i]=='S'||arr[i]=='s') //Проверка на наличие искомого символа { /*Если это искомый символ, то перенесем оставшуюся часть строки на один элемент левее.*/ for (int j=i;arr[j]!='\0';j++) arr[j]=arr[j+1]; } else i++; //а если это не искомый символ, то будем двигаться по строке дальше cout<<endl<<arr<<endl; //вывести результат}Замечание к задаче. Как Вы думаете, что произойдет, если в программу ввести строку содержащую пробелы (т.е. нарушить условия задачи)?
Пример 6
Задача. Написать программу сравнения двух строк.
Перед тем как перейти непосредственно к программе, сделаем примечание. В некоторых случаях желательно вводить в массив полную строку текста. С этой целью C++ снабжен функцией cin.getline(s). Функция cin.getline(s) требует три аргумента – массив символов, в котором должна храниться строка текста, длина и символ ограничитель. Например, фрагмент программы
char sentence [80];
cin. getline (sentence, 80, '\n');объявляет массив sentence из 80 символов, затем считывает строку текста с клавиатуры в этот массив. Функция прекращает считывание символов в случаях, если встречается символ-ограничитель '\n', если вводится указатель конца файла или если количество считанных символов оказывается на один меньше, чем указано во втором аргументе (последний символ в массиве резервируется для завершающего нулевого символа). Если встречается символ ограничитель, он считывается и отбрасывается. Третий аргумент cin.getline(s) имеет '\n' в качестве значения по умолчанию, так что предыдущий вызов функции мог быть написан в следующем виде:
cin.getline(sentence, 80);
#include<iostream.h>#include<string.h>void main(){ int len; // длина вводимой строки char s[81]; // место хранения вводимой строки char *s1,*s2;cout<<"Vvedite pervyyu stroky: "; cin.getline(s, 80); // ввод первой строкиlen = strlen(s); // определение длины строкиs1 = new char[ len + 1]; // динамическое выделение памяти под строку s1strcpy(s1, s); // копирование введенной строки в строку s1cout<<" Vvedite vtoryyu stroky: "; cin.getline(s, 80); // ввод второй строкиlen = strlen(s);s2 = new char[len + 1]; // динамическое выделение памяти под строку s2strcpy(s2, s);// какая из введенных строк больше?if(strcmp(s1, s2) > 0) cout<<"Stroka s1:\t"<<s1<<"\n\t > \n" << "Stroka s2:\t"<<s2<<endl; else if (strcmp(s1, s2) == 0) cout<<"String s1:\t"<<s1<<"\n\t=\n" <<"String s2:\t"<<s2<<endl; else cout<<"String s1:\t"<<s1<<"\n\t < \n" <<"String s2:\t" <<s2<<endl; delete []s1; // удаление строк из памяти delete []s2;}Пример
Дата добавления: 2014-12-15; просмотров: 222 | Поможем написать вашу работу | Нарушение авторских прав |