Строка как массив символов. Использование функций поиска из библиотеки обработки строк

Страницы работы

Фрагмент текста работы

  • результате на экран будут выведены еще три пустые строки, а символ ‘\n’ так и останется во входном потоке. Это символ надо удалить из потока путем вызова get без параметров.
  • Метод getline после прочтения строки не оставляет во входном потоке символ ‘\n’ , поэтому лучше пользоваться им.

10

Строки

  • Способы ввода/вывода строк :
    • С использованием функций ввода/вывода языка С
    • #include <stdio.h>
    • int main()
    • { const int n = 80;
    • char s[n];
    • gets(s); puts(s);
    • }
    • #include <stdio.h>
    • int main()
    • { const int n = 80;
    • int a; float b;
    • char s[n];
    • puts(" s : "); gets(s);
    • printf("a = "); scanf("%d",&a);
    • printf("b = "); scanf("%f",&b);
    • printf("%2d%25s%5.1f\n",a,s,b);
    • }

11

Строки

  • Очень удобный способ ввода-вывода строк – использование функций языка С gets и puts.
  • Вывод при помощи функции printf удобнее использовать в том случае, если в одном операторе требуется вывести данные различных типов. Если же работа выполняется только со строками, то следует использовать puts.

12

Строки

  • Основные библиотечные функции для обработки строк в стиле С ( объявлены в файле string.h).
    • unsigned strlen(char* s)
    • int *strcmp(char* s1, char* s2)
    • char *strchr(char* s, int ch)
    • char* strstr(char* s1 char* s2)
    • char* strcpy(char* s1, char* s2)
    • char* strcat(char* s1, char* s2)
    • char* strtok(char* s1, char* s2)

13

Строки

  • Использование функций копирования
  • #include <iostream>
  • #include <string.h>
    • using namespace std;
  • int main()
  • { char x[]= "The string C++"; char y[50],z[15];
  • cout << " x : " << x << endl;
  • cout << " y : " << strcpy(y,x) << endl;
  • strncpy(z,x,10); z[10] = '\0';
  • cout << " z : " << z << endl;
  • }

14

Строки

  • Функция strcpy(y,x ) – копирует строку х в y, включая завершающий нулевой символ.
  • Функция strncpy(z, x, n) – копирует не более чем n символов массива x в z.
  • Если x – это строка длиной меньше, чем n, то в z дописывается нулевой символ столько раз, сколько нужно, чтобы общее количество скопированных символов равнялось n.

15

Строки

  • Использование функций объединения строк
  • #include <iostream>
  • #include <string.h>
    • using namespace std;
  • int main()
  • { char s1[50]= "C++ "; char s2[] = "in samples and tasks";
  • char s3[50]=" ";
  • cout << "s1 = " << s1 << endl << "s2 = " << s2 << endl;
  • cout << "strcat(s1,s2) = " << strcat(s1,s2) << endl;
  • cout << "strncat(s3,s1,14) = " << strncat(s3,s1,14) << endl;
  • }

16

Строки

  • Функция strcat(s1,s2 ) – добавление копии строки s2, включая завершающий нулевой символ, в конец строки s1. Начальный символ строки s2 записывается поверх нулевого символа в конец строки s1.
  • Функция strncat(s1, s2, n) – добавляет не более чем n символов массива s2 в конец строки s1.

17

Строки

  • Сравнение строк
  • #include <iostream>
  • #include <string.h>
    • using namespace std;
  • int main()
  • {
  • cout << "\n Abc and Abc " << strcmp("Abc","Abc");
  • cout << "\n abc and Abc " << strcmp("abc","Abc");
  • cout << "\n abcd and abc " << strcmp("abcd","abc");
  • cout << "\n Abc and Abcd " << strcmp("Abc","Abcd");
  • cout << "\n abcd and abce " << strcmp("abcd","abce");
  • cout << "\n Abce and Abcd " << strncmp("Abce","Abcd",2);
  • cout << "\n Abc and abc " << stricmp("Abc","abc");
  • cout << "\n ABc and abd " << strnicmp("ABc","abd",2);
  • cout << endl;
  • }

18

Строки

  • Функция strcmp(s1,s2 ) – возвращает 0, если строки равны, отрицательное значение, если первая строка меньше, чем вторая, и положительное значение, если первая строка больше, чем вторая.
  • Функция strncmp(s1,s2 ) – используется для сравнения только первых n символов двух строк.
  • Функции stricmp(s1,s2 ) и strnicmp(s1,s2 ) используются для сравнения строк без учета регистра, т. е. без различия между прописными и строчными буквами.

19

Строки

  • Определение длины строки и разделение строки на лексемы (слова)
  • #include <iostream>
  • #include <string.h>
    • using namespace std;
  • int main()
  • { char string[]= "This sentence;has-5 words.";
  • char * tokenPtr;
  • cout << "\n string :" << endl << string;
  • cout << "\n length string :" << strlen(string);
  • cout << "\n words :" << endl;
  • tokenPtr = strtok(string, " ;-.");
  • while (tokenPtr != NULL)
  • { cout << tokenPtr << endl;
  • tokenPtr = strtok(NULL," ;-.");
  • }
  • }

20

Строки

  • Рассмотрим пример определения длины строки и разбиения строки на лексемы (слова).
  • Функция strlen() возвращает длину строки (без учета символа завершения строки).
  • Для разбиения строки на лексемы (слова) используется последовательность вызовов функции strtok () .
  • Функция strtok () возвращает из строки string следующую лексему, отделенную любым разделителем.
  • tokenPtr – указатель, ссылающийся на следующий символ, начиная с которого должен осуществляться поиск следующей лексемы.
  • Каждый последующий вызов функции с нулевым указателем в качестве значения первого аргумента продолжает поиск лексем, начиная с того места в строке, на которое указывает возвращенное в результате последнего вызова значение указателя.
  • Функция strtok () возвращает нулевой указатель, если лексемы не обнаружены.

21

Строки

  • Библиотечные функции обработки символов (ctype.h)

22

Строки

23

Строки

24

Строки

  • Библиотечные функции преобразования строк (stdlib.h)

25

Строки

  • Функции поиска из библиотеки обработки строк (string.h)

26

Строки

  • Примеры использования функций поиска из библиотеки обработки строк (string.h)
  • #include <iostream>
  • #include <string.h>
  • using namespace std;
  • int main()
  • { // использование strchr
  • char *str ="This is a text";
  • char ch1 = 's', ch2 = 'o';
  • cout << endl << "ch1 = " << ch1 << " ch2 = " << ch2 << endl;
  • if (strchr(str, ch1) != NULL)
  • cout << "ch1 is in " << "\"" << str << "\"" << endl;
  • else
  • cout << "ch1 is not in " << "\"" << str << "\"" << endl;
  • if (strchr(str, ch2) != NULL)
  • cout << "ch2 is in " << "\"" << str << "\"" << endl;
  • else
  • cout << "ch2 is not in " << "\"" << str << "\"" << endl;
  • }

27

Строки

  • Примеры использования функций поиска из библиотеки обработки строк (string.h)
  • #include <iostream>
  • #include <string.h>
  • using namespace std;
  • int main()
  • { // использование strcspn и strspn
  • char *str1 = "The value is 3.14159";
  • char *str2 = "3.14159 is the value";
  • char *str3 = "1234567890";
  • cout <<endl <<"str1 = "<< str1 <<" str3 = " <<str3 << endl;
  • // длина начальной части строки str1, не содержащая
  • // символов из str2, равна
  • cout << " - " << strcspn(str1,str3) << endl;
  • cout <<endl <<"str2 = "<< str2 <<" str3 = " <<str3 << endl;
  • // длина начальной части строки str1, содержащая только
  • // символы из str2, равна
  • cout << " - " << strspn(str2,str3) << endl;
  • }

28

Строки

  • Примеры использования функций поиска из библиотеки обработки строк (string.h)
  • #include <iostream>
  • #include <string.h>
  • using namespace std;
  • int main()
  • { char *str = "This is a text";
  • // использование strpbrk
  • char *str2 = "pink";
  • char *str3 = "is a";
  • cout <<endl <<"str = "<< str <<" str2 = " <<str2 << endl;
  • // среди символов строки str2 первый, встречающийся
  • // в строке str
  • cout << " - " << strpbrk(str,str2) << endl;
  • // использование strstr
  • cout <<endl <<"str = "<< str <<" str3 = " <<str3 << endl;
  • cout << " - " << strstr(str,str3) << endl;
  • }

29

Строки

  • Пример 1:
  • /* Дана строка символов, состоящая из слов. Слова разделяются пробелом. Удалить из строки все слова, начинающиеся с цифры.*/
  • #include <stdio.h>
  • #include <string>
  • #include <ctype.h>
  • using namespace std;
  • int main(void)
  • { char s[250], //исходная строка
  • w[25], //слово
  • mas[10][25]; //массив слов
  • int k=0,t=0,i,len,j;
  • puts("\n Введите строку");
  • gets(s);
  • len = strlen(s);

30

Строки

while(t<len) { for(j=0,i=t; s[i]!= ' '; i++, j++) w[j] = s[i]; //формируем слово до пробела w[j] = '\0'; //формируем конец строки strcpy(mas[k],w); //копируем слово в массив k++; //увеличиваем счетчик слов t=i+1; //переходим к следующему слову в исходной строке } strcpy(s,""); //очищаем исходную строку for(t=0; t<k; t++) if(!isdigit(mas[t][0])) //если символ не цифра { strcat(s,mas[t]); //копируем в строку слово strcat(s," "); //копируем в строку пробел } puts(s); //выводим результат }

31

Строки и функции

  • Задача: составить функцию, которая переставляет символы строки в обратном порядке.
  • Алгоритм:
    • определить длину строки ;
    • все символы первой половины строки переставить с соответствующими символами второй половины:

32

Строки и функции

  • Программа:
  • #include <conio.h>
  • #include <string>
  • using namespace std;
  • void Reverse ( char s[])
  • { int len = strlen(s);
  • char c;
  • for ( int i = 0; i < len/2; i ++ )
  • { c = s[i]; s[i] = s[len-i-1]; s[len-1-i] = c; }
  • }
  • int main()
  • { char s[] = "0123456789";
  • Reverse(s); puts(s);
  • Reverse(s + 5); puts(s); // инверсия части строки
  • }

33

Строки и текстовые файлы

  • Функции ввода - вывода для посимвольной обработки текстовых файлов:

Похожие материалы

Информация о работе