Феноменальный Источник Ресурсов сети - Функции работы со строками из библиотеки обработки строк
Четверг, 17.05.2012, 03:11
Приветствую Вас Гость


Общение на сайте
200
Все Новости
Обновление сайта [25]
Изменение и модернизация
Из мира железа [27]
Компьютерное Железо
Из мира софта [216]
Программы, софт, ПО
Вирусы и антивирусы [33]
Вредоносные проги, антивирусы
Сети и всё о них [10]
Сети, технологии, топологии, интернет
Статистика сайта [3]
Статистика сайта, лучшие статьи, лучшие новости, популярность материалов
Статьи [14]
Полезная информация
Обучение

БГТУ Им. Шухова




Информационное


Компьютерные
преступления
Неправомерный доступ к компьютерной информации
Создание, использование и распространение вредоносных программ для ЭВМ
Нарушение правил эксплуатации ЭВМ, системы ЭВМ или их сети.
Нарушение авторских и смежных прав
Компьютерный юмор
101 Причина, Почему Вы не можете Найти Вашего Сисадмина
Админы и программеры
Раз в жизни каждый сисадмин делал это...
Антивирусы - Бойцы Системы
Как сэкономить на компьютере?
Как сломать систему windows или вывести её из строя
Интересные фото компьютеров
Самые прикольные мобильные телефоны (фото)
Опрос
Какую антивирусную программу вы считаете самой эффективной? Антивирус от:
Всего ответов: 42
Пожертвуй сайту
Яндекс Деньгами на счёт
41001890037109 руб.


WebMoney на кошелек
Z356613988370
WMZ

Подробнее...

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

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

  1. Функция int strlen (const char* s); - определяет длину строки s. Возвращает количество символов, предшествующих завершающему нулевому символу. Обратите внимание, завершающий ноль-символ в длину не включается. Например,
    cout << strlen("Hello!"); // на экране будет 6
    char *str = "one";
    cout << strlen(str); // на экране будет 3
  2. Функция char *strcpy(char *s1, const char *s2); - копирует строку s2 в массив символов s1. Возвращает значение s1. Массив символов s1 должен быть достаточно большим, чтобы хранить строку и ее завершающий нулевой символ, который также копируется. Например,
    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 *s1, const char *s2); - сравнивает строки s1 и s2 (по ASCII-кодам). Функция возвращает значение 0, если строки s1 и s2 равны, значение меньше ноля, если строка s1 меньше s2, и значение больше ноля, если s1 больше s2. Обратите внимание, строки сравниваются не по длине, а посимвольно, по 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 *s1, const char *s2); - добавляет строку s2 к строке s1. Первый символ строки s2 записывается поверх ноль-символа строки s1. Возвращает s1. Под s1 должно быть выделено памяти не меньше чем (strlen(s1)+strlen(s2)+1). Например,
    char st1[25] = "День";
    cout << strcat(st1, " добрый!"); // на экране будет День добрый!
  5. Функция char *strncpy(char *s1, const char *s2, int n); - копирует не более n символов строки s2 в массив символов s1. Возвращает s1.
  6. Функция char *strncmp(char *s1, const char *s2, int n); - сравнивает до n символов строки s1 со строкой s2. Возвращает 0, меньше, чем 0 или больше, чем 0, если s1 соответственно равн, меньше или больше s2.
  7. Функция char *strncat(char *s1, const char *s2, int n); - присоединяет первые n символов строки s2 в строку s1. Возвращает s1.
  8. Функция char *strchr(const char *s, int c); - проверяет строку s на содержание символа хранящегося в c. Результатом функции является адрес первого вхождения символа c в строку 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 *s1, const char *s2); - проверяет строку s1 на содержание подстроки s2. Результатом функции является адрес первого вхождения подстроки s2 в строку s1. Если подстрока не найдена, возващается NULL. Например,
    char str[20] = "ABCDEXYZ";
    char *ps = strstr(str, "DEX");
    if (ps != NULL)
    cout << ps;
    else
    cout << "Нет такой подстроки!";
    // На экране будет DEXYZ
  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, int ch); - заменяет ВСЕ символы в строке s на символ ch. Например,
    char str[30] = "ABCDE";
    cout << strset(str, 'x'); // на экране будет xxxxx
  13. Функция char *strnset(char *s, int 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, который входит в стандартную библиотеку языка С++.

Работа со строками в С++. Примеры

Пример 1.

Задача. Дана строка символов, подсчитать сколько раз среди символов строки встречается буква x.

Разбор задачи. Сначала необходимо запросить у пользователя строку, ввести ее с клавиатуры. Затем в цикле, начиная с первого символа, проверять равен ли текущий символ символу х, если да, символы равны, увеличить специальную переменную-счетчик на 1, иначе перейти к анализу следующего символа и так до конца строки. В конце вывести результат (значение переменной-счетчика) на экран. Замечание: не забудьте обнулить значение счетчика перед использованием.

#include <iostream.h>
void main( void )
{
char str[100]; // объявление строки символов
// просим пользователя ввести строку символов
cout << "\nInput a string: ";
cin >> str; // считываем строку, введенную пользователем
int count = 0; /* объявление переменной-счетчика, в которой
будем хранить количество вхождений х в строку */
// в цикле сравниваем каждый символ строки с х-ом,
// в случае совпадения увеличиваем переменную-счетчик на 1.
int i = 0;
while(str[i] != '�')
{
if (str[i] == 'x') count++;
i++;
}
// выводим результат на экран
cout << "\n Number of x is " << count;
}

Пример2

Задача. Написать программу, которая получает от пользователя набор символов, исключая пробел, и удаляет из этого набора все вхождения символов S и s.

Разбор задачи. Из условия задачи можно сделать следующие выводы: мы должны написать программу, которая при получении конкретного набора символов должна произвести проверку этого набора на наличие символов S и s. Если символ S(или s) встретится в наборе, то необходимо его удалить из этого набора. Конечный результат не должен содержать ни одного символа S и s.

Решение задачи будет состоять из трех блоков:

  • получение данных от пользователя (т.е. пользователь должен ввести строку для обработки),
  • анализ строки на наличие символов 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 << "\nDo enter any string but no more then "
<< CharCount-1 << " symbols\n";

cin >> arr; // ввод строки

int i=0;
while (arr[i]!='�') /* Цикл работает пока не встретится признак
конца строки */
if (arr[i]=='S'||arr[i]=='s') //Проверка на искомый символ
{ /*Если это искомый символ, то перенесем оставшуюся часть строки
на один элемент левее...*/
for (int j=i;arr[j]!='�';j++)
arr[j]=arr[j+1];
}
else i++; /*..., а если это не искомый символ, то будем двигаться по
нашему массиву дальше */

cout << endl << arr << endl; /* опять таки, помним,
что нужно вывести результат */
}

Замечание к задаче. Как Вы думаете, что произойдет, если в программу ввести строку содержащую пробелы (т.е. нарушить условия задачи)? Как Вы можете объяснить полученное?

Пример 3

Задача. Написать программу сравнения двух строк.

Разбор задачи. Чтобы понять, что означает одна строка "больше" или "меньше", чем другая строка, рассмотрим процесс расстановки имен по алфавиту. Вы, без сомнения, поставили бы "Jones" перед "Smith", потому что в алфавите J раньше S. Но как компьютер узнает о порядке следования букв? Помните? - все символы представляются внутри компьютера как численные коды; когда компьютер сравнивает две строки, он на самом деле сравнивает численные коды символов в строке. (Замечание: коды символов упорядочены по алфавиту только для латинских букв, к кириллице это, к сожалению, не относится)

Перед тем как перейти непосредственно к программе, сделаем еще одно примечание. В некоторых случаях желательно вводить в массив полную строку текста. С этой целью C++ снабжен функцией cin.getline. Функция cin.getline требует три аргумента - массив символов, в котором должна храниться строка текста, длина и символ ограничитель. Например, фрагмент программы

 char sentence[80];
cin.getline(sentence, 80, 'n');
объявляет массив sentence из 80 символов, затем считывает строку текста с клавиатуры в этот массив. Функция прекращает считывание символов в случаях, если встречается символ-ограничитель 'n', если вводится указатель конца файла или если количество считанных символов оказывается на один меньше, чем указано во втором аргументе (последний символ в массиве резервируется для завершающего нулевого символа). Если встречается символ ограничитель, он считывается и отбрасывается. Третий аргумент cin.getline имеет 'n' в качестве значения по умолчанию, так что предыдущий вызов функции мог быть написан в следующем виде:
 cin.getline(sentence, 80);
#include<iostream.h>
#include<string.h>
void main()
{
int len; // длина вводимой строки
char s[81]; // место хранения вводимой строки
char *s1,*s2;

cout << "Input the first string: ";
cin.getline(s, 80); // ввод первой строки
len = strlen(s); // определение длины строки
s1 = new char[ len + 1]; // динамическое выделение памяти под строку s1
strcpy(s1, s); // копирование введенной строки в строку s1

cout << "Input the second string: ";
cin.getline(s, 80); // ввод второй строки
len = strlen(s);
s2 = new char[len + 1]; // динамическое выделение памяти под строку s2
strcpy(s2, s);
// какая из введенных строк больше?
if(strcmp(s1, s2) > 0)
cout << "String s1:\t" << s1 << "\n\t > \n"
<< "String 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;
}

Интересные статьи
недавно добавленные
Меняем местами C и D или как поменять букву логического диска

Решение проблемы со шрифтами в Windows XP|Vista/7

Как правильно выбрать прошивку для DSL-2500U

Инструкция по обновлению прошивки для ADSL-модемов

Cерьезные дефекты в струйных принтерах

Несколько мифов о HDD

Блокировка одноклассники, вконтакте

Mac OS vs. Windows

РЕШЕНО! Активация Windows XP

В чем отличие между Annex A и Annex B ?

Удаление Баннеров + Разблокировка Windows

При входе в систему происходит

Интернет и ADSL

Как правильно подключить ADSL splitter

Что такое точка доступа Wi-Fi и беспроводной роутер

Ищем и устраняем проблемы лазерной печати

SVCHOST.EXE и распространенные признаки работы вирусов

Ошибка программы установки устройства Volume

Все статьи...
Релама от Begun


Программное
обеспечение
Коммуникация и связь - (5)
Офисные приложения - (134)
Звук - (119)
Антивирусное ПО - (302)
Медиа - (685)
Утилиты - (2085)

Все проги...
Партнеры и счетчики


Образовательный сервис ИнфоКонсалтинг

Каталог@Mail.ru - каталог ресурсов интернет


Наша Кнопка


Онлайн радио
Поиск для гостей
Другая статистика