Ћекции.ќрг


ѕоиск:




 атегории:

јстрономи€
Ѕиологи€
√еографи€
ƒругие €зыки
»нтернет
»нформатика
»стори€
 ультура
Ћитература
Ћогика
ћатематика
ћедицина
ћеханика
ќхрана труда
ѕедагогика
ѕолитика
ѕраво
ѕсихологи€
–елиги€
–иторика
—оциологи€
—порт
—троительство
“ехнологи€
“ранспорт
‘изика
‘илософи€
‘инансы
’ими€
Ёкологи€
Ёкономика
Ёлектроника

 

 

 

 


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




–ассмотрим некоторые типичные функции стандартной библиотеки 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 при использовании функций из библиотеки обработки строк.

2.4 –абота со строками в —++. ѕримеры

ѕример 1. ƒана строка символов, подсчитать сколько раз среди символов строки встречаетс€ буква x.

–азбор задачи. —начала необходимо запросить у пользовател€ строку, ввести ее с клавиатуры. «атем в цикле, начина€ с первого символа, провер€ть равен ли текущий символ символу х, если да, символы равны, увеличить специальную переменную-счетчик на 1, иначе перейти к анализу следующего символа и так до конца строки. ¬ конце вывести результат (значение переменной-счетчика) на экран. «амечание: не забудьте обнулить значение счетчика перед использованием.

#include УiostreamФusing namespace std;void main() { char str[100]; // объ€вление строки символов// просим пользовател€ ввести строку символов cout << "Vvedite stroky: "; cin >> str; // считываем строку, введенную пользователем int Kol = 0; /* объ€вление переменной-счетчика, в которой будем хранить количество вхождений х в строку */ // в цикле сравниваем каждый символ строки с х-ом, // в случае совпадени€ увеличиваем переменную-счетчик на 1. int i = 0; while(str[i]!= '\0') { if (str[i] == 'x') Kol++; i++; } // выводим результат на экран cout << "Kolichestvo x ravno " << Kol;}

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

–азбор задачи. »з услови€ задачи можно сделать следующие выводы: мы должны написать программу, котора€ при получении конкретного набора символов должна произвести проверку этого набора на наличие символов S и s. ≈сли символ S (или s) встретитс€ в наборе, то необходимо его удалить из этого набора.  онечный результат не должен содержать ни одного символа S и s.

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

Ј получение данных от пользовател€ (т.е. пользователь должен ввести строку дл€ обработки),

Ј анализ строки на наличие символов S и s,

Ј вывод результата.

ƒл€ нас наибольший интерес представл€ет этап анализа строки. ƒл€ реализации этого этапа нам нужно поэлементно двигатьс€ от нулевого индекса массива к последнему и делать проверку каждого элемента. ≈сли будет встречен такой элемент с индексом i, то нам нужно сместить все элементы с индексами большими чем i на один индекс меньше. ƒругими словами: пускай дана следующа€ строка:

A b s D e f0 1 2 3 4 5 ------ индексы

ѕровер€€ поиндексно каждый элемент массива, находим, что 2 элемент массива и есть искомый символ. “огда, нам нужно сместить каждый элемент массива на 1 индекс меньше, т.е. мы получим следующий результат:

A b D e f0 1 2 3 4

и тем самым добьемс€ решени€ задачи.

–еализаци€ сказанного приведена ниже на —++.

#include УiostreamФusing namespace std;void main(){ const int n=10; //зададим размерность массива через константу char A[n]; //объ€вление символьного массива //ѕредупредим пользовател€, что ввод ограничен размерностью массива cout << "Do enter any string but no more then "<< n-1 << "symbols"<<endl; cin >> A; // ввод строки int i=0; while(A[i]!='\0') //÷икл работает пока не встретитс€ признак конца строки if (A[i]=='S'||A[i]=='s') //ѕроверка на искомый символ {/*≈сли это искомый символ, то перенесем оставшуюс€ часть строки на один элемент левее...*/ for (int j=i;A[j]!='\0';j++) A[j]=A[j+1]; } else i++; /*, а если это не искомый символ, то будем двигатьс€ по нашему массиву дальше */ cout << endl << A << endl; // вывод результата */ }

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

ѕример 4. ќпределить количество символов в своей ‘амилии.

#include УiostreamФ #include <string.h> //ѕодключаем строковую библиотеку! using namespace std;   void main() { char s1[]="»ванов"; cout << strlen(s1); }

ѕример 5. — помощью функции strcat добавить к своему имени отчество.

  #include "iostream" #include <string.h> using namespace std;   void main() { char s1[55]="Ekaterina"; char s2[55]="Alikseevna"; cout << strcat(s1, s2); }

ѕример 6. Ќаписать программу сравнени€ двух строк.

–азбор задачи. „тобы пон€ть, что означает одна строка "больше" или "меньше", чем друга€ строка, рассмотрим процесс расстановки имен по алфавиту. ¬ы, без сомнени€, поставили бы "Jones" перед "Smith", потому что в алфавите J раньше S. Ќо как компьютер узнает о пор€дке следовани€ букв?

¬спомним, что все символы представл€ютс€ внутри компьютера как численные коды; когда компьютер сравнивает две строки, он на самом деле сравнивает численные коды символов в строке. («амечание: коды символов упор€дочены по алфавиту только дл€ латинских букв, к кириллице это, к сожалению, не относитс€)

#include "iostream" #include <string.h> using namespace std;   void main() { char s1[5]; // объ€вление символьного массива cout<<"Enter a string (max 4 symbols):"; cin>>s1; // ввод строки char s2[5]; // объ€вление символьного массива cout<<"Enter a string (max 4 symbols):"; cin>>s2; // ввод строки   // кака€ из введенных строк больше? 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; }




ѕоделитьс€ с друзь€ми:


ƒата добавлени€: 2015-05-07; ћы поможем в написании ваших работ!; просмотров: 1058 | Ќарушение авторских прав


ѕоиск на сайте:

Ћучшие изречени€:

Ћибо вы управл€ете вашим днем, либо день управл€ет вами. © ƒжим –он
==> читать все изречени€...

531 - | 440 -


© 2015-2023 lektsii.org -  онтакты - ѕоследнее добавление

√ен: 0.015 с.