Студопедия  
Главная страница | Контакты | Случайная страница

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Функции работы со строками из библиотеки обработки строк

Читайте также:
  1. A) Плавно или с помощью кнопок- строки заголовка.
  2. Cудeбныe функции князя и вeчe
  3. D. Требования к структуре и оформлению курсовой работы.
  4. E. Порядок защиты курсовой работы.
  5. I ОРГАНИЗАЦИОННО-МЕТОДИЧЕСКИЕ УКАЗАНИЯ ПО ВЫПОЛНЕНИЮ КУРСОВОЙ РАБОТЫ
  6. I Принцип работы клавиатур
  7. I. ОБЩИЕ ПОЛОЖЕНИЯ ПО ВЫПОЛНЕНИЮ КОНТРОЛЬНОЙ РАБОТЫ
  8. I. Общие рекомендациик написанию курсовой работы
  9. I. Основные задачи и направления работы библиотеки
  10. I. ОСНОВНЫЕ ПОЛОЖЕНИЯ. РУКОВОДСТВО ПОДГОТОВКОЙ И НАПИСАНИЕМ КУРСОВОЙ РАБОТЫ

Рассмотрим некоторые типичные функции стандартной библиотеки string.h. Это библиотека обработки строк, которая обеспечивает много полезных функций для работы со строковыми данными, например, сравнение строк, поиск в строках нужных символов и других подстрок, разметку строк (разделение строк на логические куски) и определение длины строки.

1. Функция

int strlen (const char * s);

Определяет длину строки s. Возвращает количество символов, предшествующих завершающему нулевому символу. Обратите внимание, завершающий ноль-символ в длину не включается. Например,

cout << strlen ("Hello!"); // на экране будет 6 char * str ="one"; cout << strlen (str); // на экране будет 3

2. Функция

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"). Например,

cout << strcmp ("compare", "string"); /* на экране будет −1, поскольку "compare" меньше "string" */ cout << strcmp ("abcde", "abc"); /* на экране будет 1, поскольку "abcde" больше "abc" */ cout << strcmp ("one", "one"); /* на экране будет 0, поскольку строки равны */

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_xyz

11. Функция

char * strupr (char * s);

Конвертирует строку к верхнему регистру (т.е. переводит строку в прописные символы).

12. Функция

char * strset (char * s, char ch);

Заменяет ВСЕ символы в строке s на символ ch. Например,

char str [30] = "ABCDE"; cout << strset (str, 'x'); // на экране будет xxxxx

13. Функция

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; просмотров: 63 | Поможем написать вашу работу | Нарушение авторских прав




lektsii.net - Лекции.Нет - 2014-2024 год. (0.009 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав