Скачать презентацию Стрикелева Л В Программирование Лекция 13 Строки Скачать презентацию Стрикелева Л В Программирование Лекция 13 Строки

л_13_Строки.ppt

  • Количество слайдов: 50

Стрикелева Л. В. Программирование Лекция 13 Стрикелева Л. В. Программирование Лекция 13

Строки В С++ отсутствует специальный строковый тип. В С++ используются два вида строк: • Строки В С++ отсутствует специальный строковый тип. В С++ используются два вида строк: • строка как массив символов типа char (char*-строки) • строка как объект класса string (рассмотрим во 2 -ом семестре) строка как массив символов типа char: const int MAX = 80; //размер строки char str [MAX]; //сама строка, ее определение похоже на определение массива типа char cin >> str; //ввод строки, например, вводим строку “Minsk” Последним символом строки (как массива элементов типа char) обязательно должен быть ’’ (нуль-символ), поэтому к длине массива всегда необходимо добавлять 1. В памяти: M i n s k строковый буфер str Л. В. Стрикелева Программирование … неиспользуемая часть строкового буфера 2

 Строки Примеры char str [20] = “Good Morning”; cout << str; // Good Строки Примеры char str [20] = “Good Morning”; cout << str; // Good Morning G o o d 0 1 2 «Мусор» M o r n i n g 5 7 8 9 10 11 12 o o r n i n g 6 7 8 9 10 11 12 l o o r n i n g 8 9 10 11 12 3 4 6 13 14 15 16 17 18 19 strcpy(str, “Hello”); cout << str; // Hello H e l l 0 2 3 4 1 5 strcpy(str, “”); e l 0 1 2 3 4 5 6 7

Строки Строковые константы Как и другие типы данных, строки могут быть: переменными и константами Строки Строковые константы Как и другие типы данных, строки могут быть: переменными и константами В строковый литерал можно включать непечатаемые символы: ”abcndef” //символы будут напечатаны в две строки ”abc\ndef” //будет выдано abcndef Длинный строковый литерал предполагает запись: ”abc def” // напечатает abcdef; т. к. – символ продолжения строки НО!!! ”abc def” // error!!! Строка ”abc00 def” будет обрабатываться как abc (‘’ – означает конец строки). В строковом литерале возможно использование нескольких строк: "текст1""текст2""текст3"; cout << "abc\ndef" "aaa" "mmm"<< endl; выведет строку abcndefaaammm. #define OTVET 1 "odin" //препроцессорная строка-константа Л. В. Стрикелева const char str[3] ="dwa"; // типизированная строка-константа Программирование 4

 Строки Определение строк : 1. строка как массив символов: char string [ ] Строки Определение строк : 1. строка как массив символов: char string [ ] = “Minsk”; // 0 -символ добавляется автоматически char string 1 [6] = “Minsk”; // 0 -символ добавляется автоматически char string 2 [6] = {‘M’, ‘i’, ‘n’, ‘s’, ‘k’, ‘’}; //0 -символ добавляем сами cout << sizeof (string 1) << endl; //размер строки равен 6 cout << strlen (string 1) << endl; //длина строки равна 5, прототип функции в Имя строки (как и для любых других массивов) – константный указатель на неконстантные данные (на элемент с номером 0); т. е. имя строки всегда указывает на одну и ту же ячейку памяти, но используя это имя и индексы можно обращаться ко всем данным в строке и изменять их: string [i] = *(string +i). Отличие от массивов!!! : при выводе указатель автоматически разыменовывается, и мы получаем строку, начинающуюся с элемента номер 0 и заканчивающуюся 0 -символом: cout << string << endl; cout << &string << endl; //выводит адрес Константные указатели ( указатели, объявленные как const: int *const pi ) должны получать начальные значения при своем определении. string 1++; нельзя!!! указатель-константа pi++ нельзя!!! 5 string 1 [i] = 5; //можно!!! данные неконстантные pi[2]=3; можно!!! Л. В. Стрикелева Программирование

 Строки Определение строк : 2. строка как указатель на char: char *string 4 Строки Определение строк : 2. строка как указатель на char: char *string 4 = “Minsk”, *string 5; //инициализация указателя string 4 string 5 = “design”; //инициализация указателя string 5 В этом случае имена строк – неконстантные указатели на константные данные: т. е. данные «только для чтения» . char *s 1= “pointer_of_simvol”; Хороший стиль – объявлять //s 1[3]='q'; !!!error, попытка изменить константные данные сonst char *string 4 = “Minsk”; s 1++; // OK!!! cout << s 1; // ointer_of_simvol Неконстантные указатели string 4 и string 5 получают начальные значения, равные адресам первых элементов строковых литералов. Сами литералы в формате С-строки располагаются в памяти программы. Указатель на char автоматически разыменовывается как и для строки–массива. В качестве отрицательных последствий: char c=‘a’; char *pc=&c; cout << pc; выводит из памяти все подряд с адреса символа ‘a’ и до «случайного» символа ‘’. cout << sizeof (string 4) << endl; // выведет 4, размер указателя !!! cout << sizeof (*string 4) << endl; // выведет 1, нулевой элемент строки cout << strlen (string 4) << endl; // выведет 5, без ‘’, прототип функции в Л. В. Стрикелева Программирование 6

 Строки 3. строка как элемент массива строк char den[ ][10]= { Строки 3. строка как элемент массива строк char den[ ][10]= {"poned", "vtor", "sreda", "chetv", "pjatn", "sub", "voskr"}; 4. строка как элемент массива указателей на char *otvet 1[ ] = { ”odin”, “dwa” }; char str 1[ ] = "string-array"; // строка-массив: str 1– константный указатель // на неконстантные данные, инициализируется литералом cout << str 1 << endl; //выведет: string-array // str 1++; // нет, str 1 – указатель-константа str 1[0]='a'; // да, str 1 – указатель на неконстантные данные cout << str 1[0]<< endl; // выведет первый элемент строки: a char* str 2 = "string-pointer"; // строка-указатель: str 2– неконстантный указатель // на строковую константу, инициализируется ее адресом cout << str 2 << endl; //выведет: string- pointer str 2++; // да, str 2 – указатель-переменная // str 2[1]='a'; // нет, str 2 – указатель на константу cout << str 2<< endl; //выведет: tring-pointer Для динамической строки описываем указатель на char и выделяем память с помощью new или malloc. Динамические строки, как и другие char *p = new char[m]; динамические массивы, нельзя 7 char *q = (char *) malloc(m*sizeof(char)); инициализировать при создании Л. В. Стрикелева Программирование

Строки. Особенности работы с C-строками, описанными разными способами //пример 1: строка-указатель #include <string. h> Строки. Особенности работы с C-строками, описанными разными способами //пример 1: строка-указатель #include #include int main ( ) {char *name; //указатель на символ name = (char*) malloc(10); printf (“ name? n“); // OK!!! scanf (“%s”, name); // или cin >> name; char *name 1; //указатель на символ name 1 = “hello”; // OK!!! printf (“%s %s”, name 1); char *name 2; //указатель на символ printf (“ name? “); //scanf (“%s”, name 2); error!!! //место под строку не выделено return 0; //пример 2: строка-массив int main ( ) { char name 3 [10]; //строка-массив printf (“ name? “); // OK!!! scanf (“%s”, name 3); //или cin >> name 3; char name 4[10]; //строка-массив strcpy (name 4, “hello”); // OK!!! printf (“%s %sn”, name 3, name 4); char name 5[10]; //строка-массив // name 5 = “привет”; error!!! } //попытка изменить адрес строки char *string = ”Minsk”; char *string 1 = ”Minsk”; //строки инициализируются одним адресом } Л. В. Стрикелева Программирование 8

Строки. Особенности работы с С-строками • для представления с-строк используются массивы элементов типа char, Строки. Особенности работы с С-строками • для представления с-строк используются массивы элементов типа char, содержащие в конце последовательности значащих символов код ’’; • с-строка ограничена размером массива, который выделен для ее представления; размер нединамической с-строки должен быть задан только константным выражением; • cтрока может быть проинициализирована как поэлементно символьными значениями, так и значением строкового литерала, причем завершающий символ ‘’ формируется в этом случае в конце строки автоматически; • нулевая строка – это строка, которая начинается с 0 -символа ‘’ (ее длина равна нулю, но в памяти она может занимать больше одного байта); нулевой указатель на строку (char *p_str = NULL; ) не является эквивалентом нулевой строки; • текущая длина строки отслеживается в процессе выполнения действий над строкой; • при помещении в выходной поток cout имени символьного массива выводится не адрес массива (как для массивов с элементами другого типа), а его содержимое (до завершающего символа ‘’); • для работы с с-строками используются библиотечные функции языка С, описанные в заголовках и <сstring>, однако надо учитывать, что в этих функциях нет контроля за границами строк. 9 Л. В. Стрикелева Программирование

 Строки и указатели s a b c d � typedef char ar_char [5]; Строки и указатели s a b c d typedef char ar_char [5]; pchar ar_char s ="abcd"; cout << s << endl; // abcd 0 char *pchar = NULL; pchar =s; cout << pchar << endl; // abcd parchar =&s cout << *pchar << endl; // a parchar cout << *(pchar +2); // c 0 ar_char *parchar = NULL; // parchar =s; error!!!, convert from 'ar_char' to 'ar_char (*) ' // pchar =&s; error!!! parchar =&s; // ok!!! cout<< parchar << endl; // адрес строки-массива cout << * parchar << endl; // abcd строка-массив cout << ** parchar << endl; // a первый символ строки-массива Слайд не для всех!!!

Строки. Ввод-вывод строк Операции со строками в стиле С int main () { const Строки. Ввод-вывод строк Операции со строками в стиле С int main () { const int n = 40; char str[n]; printf (" string? n"); scanf ("%s", str); //odin_dwa printf (" %sn", str); //odin_dwa printf (" %3 sn", str); //3 – минимальный размер поля вывода : odin_dwa printf (" %10. 2 sn", str); // od выравнивание вправо и 2 символа printf (" %-10. 2 sn", str); //od выравнивание влево и 2 символа printf (" string? n"); scanf ("%s", str); //odin dwa ввод до пробела printf (" %sn", str); //odin fflush (stdin); // для корректного вызова scanf() требуется очистка буфера ввода printf (" string? n"); gets(str); //odin dwa puts(str); //odin dwa _getch(); return 0; } Л. В. Стрикелева Программирование Функция scanf() выполняет ввод строки до первого пробельного символа (из нескольких слов введется только первое). (из нескольких слов строки введется только Функция gets() вводит с пробелами. первое) 11

Строки. Ввод-вывод строк Преобразование значения базового типа в С-строку Функция sprintf() аналогична printf(), однако Строки. Ввод-вывод строк Преобразование значения базового типа в С-строку Функция sprintf() аналогична printf(), однако выводит данные в строку-буфер. char buf [20]; int i=22222; sprintf_s(buf, "%7 d", i); //вывод переменной i типа int в строку-буфер buf, cout << buf<< endl; //длина которой равна 7: ” 22222” sprintf_s(buf, "%5 d", i); //вывод переменной i типа int в строку-буфер buf, cout << buf<< endl; // длина которой равна 5: ” 22222” char c='a'; sprintf_s(buf, "%7 c", c); //вывод переменной c типа char в строку-буфер buf, cout << buf<< endl; // длина которой равна 7: ” a” sprintf_s(buf, "%c", c); //вывод переменной c типа char в строку-буфер buf, cout << buf<< endl; // длина которой равна 1: ”a” double d=1. 23; sprintf_s(buf, "%5 f", d); //вывод переменной d типа double, длина которой cout << buf<< endl; // равна 8: ” 1. 230000”, в строку-буфер buf sprintf_s(buf, "%9 f", d); //вывод переменной d типа double (длина 8)в строку-буфер cout << buf<< endl; // buf длины 9: ” 1. 230000” sprintf_s(buf, "%11 f", d); //вывод переменной d типа double в строку-буфер buf cout << buf<< endl; // длины 11: ” 1. 230000” 12 Л. В. Стрикелева Программирование

Строки. Ввод-вывод строк Операции со строками в стиле С int main() {//посимвольный ввод-вывод строки Строки. Ввод-вывод строк Операции со строками в стиле С int main() {//посимвольный ввод-вывод строки {//посимвольный ввод строки int i=0; const int MAX = 10; printf (“n. Enter a string: "); char str [MAX]; printf (“n. Enter a string: "); while ( (str[i] = _getch() ) !=13 ) // или != ‘r’ for (int i=0; i> str; //ввод строки cout << "You entered: " << str << endl; _getch(); return 0; } Л. В. Стрикелева ввод выполняется до пробельного символа Программирование {//посимвольный ввод строки const int MAX = 10; char str[MAX]; cout << "Enter a string: "; for (int i=0; i< MAX-1; i++) cin >> str[i]; str[MAX-1]=''; cout << "You entered: " << str << endl; _getch(); return 0; 13 }

Строки. Ввод-вывод строк Операции со строками в стиле С++ При помещении строки в поток Строки. Ввод-вывод строк Операции со строками в стиле С++ При помещении строки в поток cin пробелы и символы новой строки конвертируются в завершающий нулевой байт Для ввода любых символов, включая пробельные, используются методы get() и get(c) класса istream, объектом которого является cin: //посимвольный ввод строки с использованием метода get() int main() {const int MAX = 10; char str[MAX]; // строка-массив cout << "Enter a string: "; for (int i=0; i< MAX-1; i++) cin. get(str[i]); //ввод символов 12345 9 str[MAX-1]=''; cout << " string : " << str << endl; //вывод строки 12345 9 _getch(); return 0; } cin >> setw (MAX) >> str; //ввод не более MAX-1 символов строки // если больше, то они не будут вставлены scanf (“%ks”, name); //k – количество символов строки, которое необходимо ввести Л. В. Стрикелева Программирование 14

Строки. Ввод-вывод строк Операции со строками в стиле С++ //ввод строки из нескольких слов Строки. Ввод-вывод строк Операции со строками в стиле С++ //ввод строки из нескольких слов с использованием метода getline() int main() { Для ввода строки из нескольких слов const int MAX = 80; используются методы getline() или get() char str[MAX]; объекта cin cout << "n. Enter a string: "; cin. getline (str, MAX); //ввод строки в str //символ ‘n’ считывается (удаляется) из потока ввода //и вместо него в строковую переменную записывается ‘’ cout << "You entered: " << str << endl; cin. get (str, MAX); // ввод строки в str //символ ‘n’ остается в потоке //в строковую переменную добавляется ‘’ cout << "You entered: " << str << endl; _getch(); return 0; } // ввод нескольких строк, завершающихся , в качестве одной строки const int MAX = 2000; char str[MAX]; Enter a string: int main() qwert 12345 { cout << "n. Enter a string: n"; qwert$ You entered: cin. get(str, MAX, '$'); //ввод строк завершается символом $ qwert cout << "You entered: n" << str << endl; 12345 _getch(); qwert return 0; 15 Л. В. Стрикелева } Программирование

Строки. Ввод-вывод строк Операции со строками в стиле С++ Метод get() при вызове с Строки. Ввод-вывод строк Операции со строками в стиле С++ Метод get() при вызове с двумя аргументами два раза подряд работает хорошо, при условии : char s[10]; int n=5; cin. get (s, n); //1 cout << s << endl; //2 cin. get (); cin. get (s, n); //3 cout << s << endl; //4 cin. get (); cin. get (s, n); //5 cout << s << endl; //6 cout << "end" << endl; //7 Результат работы : 123 Результат работы без cin. get(): 123 234 123 Еще лучше – использовать в 234 таких случаях метод getline(). 345 end Ввод нескольких строк : int main() { const int n = 80; char s[n]; while (cin. getline(s, n)) { //ввод строки s, cout << s << endl; //вывод строки //………. обработка строки } _getch(); выход из цикла – ctrl+z – признак конца файла return 0; Л. В. Стрикелева } Программирование 16

Строки. Ввод-вывод строк Операции со строками char h[ ] =”Press any key!”; посимвольный вывод Строки. Ввод-вывод строк Операции со строками char h[ ] =”Press any key!”; посимвольный вывод строки char *hd =”Press any key!”; //размер=14+1 for (int i=0; i<15; i++) putchar (*(h+i)); //OK! ( h[i]) putchar (‘n’); for (int i=0; i<15; i++) putchar (*(hd+i)); // OK! (hd[i]) putchar (‘n’); while (*hd !=’’) putchar (*hd++); // OK!, указатель-переменная putchar (‘n’); //while (*h !=’’) putchar (*h++); //неправильно!!! константный указатель putchar (‘n’); ввод ограниченного числа символов строки int main() {const int MAX = 6; char str [MAX]; cout << "Enter a string: "; cin >> setw (MAX) >> str; //odin_dwa cout << str << endl; //odin_ return 0; o d i n _ } Л. В. Стрикелева Программирование 0 str 1 2 3 4 5 6 7 8 9 17

Строки. Ввод-вывод строк функция вывода строки Операции со строками void dispstr (char*); int main() Строки. Ввод-вывод строк функция вывода строки Операции со строками void dispstr (char*); int main() { // str – константный указатель на неконстантные данные char str[] = "Idle people have the least leisure. "; // или // char *str = "Idle people have the least leisure. "; dispstr(str); //вызов функции вывода строки _getch(); return 0; } void dispstr(char* ps) //функция вывода строки {while( *ps ) // ps – неконстантный указатель на неконстантные данные cout << *ps++; } int main() { // str – константный указатель на неконстантные данные //char str[] = "Idle people have the least leisure. "; char *str = "Idle people have the least leisure. "; dispstr(str); _getch(); return 0; } void dispstr(char* ps) //вызов функции вывода строки //функция вывода строки //но!!!? Ошибка выполнения, хотя while( *ps ) //ps – неконстантный указатель на { ps[0]='i'; cout << *ps++; Л. В. Стрикелева } Программирование неконстантные данные 18

Строки копирование строк «вручную» //копирование строки void vvodstr (char*, const int); //ввод строки void Строки копирование строк «вручную» //копирование строки void vvodstr (char*, const int); //ввод строки void vyvodstr (char*); //вывод строки void copystr (char*, const char*); //копирование строки int main() void copystr(char* dest, const char* src) {const int MAX=80; { char str 1[MAX]; char str 2[MAX]; while( *src ) //пока не 0 -символ vvodstr (str 1, MAX); *dest++ = *src++; //копировать символ vyvodstr (str 1); *dest = ''; /завершить строку 0 -символом copystr(str 2, str 1); } cout << "new "; или unsigned j; vyvodstr (str 2); for(j=0; j < strlen(str 1); j++) _getch(); str 2[j] = str 1[j]; return 0; str 2[j] = ''; } #include или, как и в случае с массивами: !!! #include <сstring> char s[9]; char hello[] = "motor"; memcpy (s, hello, sizeof (hello)); //копирование области памяти указанного размера Л. В. Стрикелева cout<< s<< endl; // motor Программирование //for strlen() void vvodstr(char* st, int n) {cout << "string? " << endl; cin. getline(st, n); } void vyvodstr(char* st) {cout << "string : " << endl; cout << st << endl; } 19

Строки. Возможности Си++ по «оптимизации» текста программы void scpy (char*, char*); int main() { Строки. Возможности Си++ по «оптимизации» текста программы void scpy (char*, char*); int main() { char* str 1 = " Press any key!"; char str 2[80]; scpy (str 2, str 1); //copy str 1 to str 2 cout << str 2 << endl; //display str 2 _getch(); void scpy (char s[], char t[]) return 0; { } int i=0; while ((s[i] = t[i]) !='') i++; } void scpy (char *s, char *t) { while ((*s =*t) !='') {s++; t++; } } Л. В. Стрикелева Программирование void scpy (char *s, char *t) { while ((*s++ = *t++) !=''); } void scpy (char *s, char *t) { while (*s++ =*t++); } 20

Строки. Примеры Копирование фрагмента строки после начальных пробелов unsigned char sst[80], dst[80]; i=0; while Строки. Примеры Копирование фрагмента строки после начальных пробелов unsigned char sst[80], dst[80]; i=0; while (sst[i] && sst[i] == ' ') //пока в строке есть символ и это пробел i++; // ищем символ, отличный от пробела while (sst[i]) //если еще не конец строки dst[j++] = sst[i++]; //копируем символы dst[j] = ''; //если конец копируемой строки sst, то завершаем строку dst Пропуск пробелов в строке s, начиная с позиции start for (int i=start; isspace(s[i]); i++); Удаление пробелов в конце строки i=strlen(sst)-1; while (sst[i] == ' ' && i >= 0) i-- ; sst[i+1] = ''; Л. В. Стрикелева Программирование 21

Строки. Операции со строками Определение длины строки Функция size_t strlen (const char *str) возвращает Строки. Операции со строками Определение длины строки Функция size_t strlen (const char *str) возвращает количество символов в строке str (длину строки), не включая 0 -символ. const int MAX = 80; typedef unsigned size_t; char s 1[MAX]="abcdef"; cout << strlen(s 1) << endl; // 6 Копирование строк Функция char* strcpy (char *str. Dest, const char *source) копирует символы строки source, включая завершающий 0 -символ, в строку str. Dest и возвращает указатель на ее начало. const int MAX = 80; char s 1[MAX]="abcdef", s 2[MAX]="cd"; strcpy(s 1, s 2); //cd warning C 4996 'strcpy' was declared deprecated Функция errno_t strcpy_s (char *str. Dest, size_t size. In. Bytes_str. Dest, const char *source) возвращает 0 при успешном завершении и код ошибки – в противном случае. const int MAX = 80; char s 1[MAX]="abcdef", s 2[MAX]="cd"; strcpy_s(s 1, MAX, s 2); //cd Шаблонная функция (только в С++) template errno_t strcpy_s (char (&str. Dest)[size], const char *source) позволяет вызывать функцию в привычном виде: strcpy_s (s 1, s 2); //cd Л. В. Стрикелева Программирование Стандартные функции работы со строками 22

Строки. Операции со строками Копирование строк Функция char* strncpy (char * str. Dest, const Строки. Операции со строками Копирование строк Функция char* strncpy (char * str. Dest, const char * source, size_t count) копирует не более count символов. Если 0 -символ встретился в исходной строке раньше, то копирование прекращается, а оставшиеся до count символы строки s 1 заполняются 0 -символами. В противном случае (если count меньше или равно длине строки s 2) завершающий 0 -символ в s 1 не добавляется. Функция errno_t strncpy_s( char *str. Dest, size_t size. In. Bytes_str. Dest, const char *source, size_t count) возвращает 0 при успешном завершении и код ошибки – в противном случае; Шаблонная функция (только в С++) template errno_t strncpy_s (char (&str. Dest)[size], const char *source, size_t count); позволяет вызывать функцию в привычном виде: const int MAX = 80; int count=2; char s 1[MAX]="abcdef", s 2[MAX]="cdefghj klmn"; strncpy_s(s 1, s 2, count); cout << s 1 << " " << count << endl; //cd Л. В. Стрикелева Программирование Стандартные функции работы со строками 23

Строки. Операции со строками Объединение строк Функция char* strcat (char* str. Dest, const char* Строки. Операции со строками Объединение строк Функция char* strcat (char* str. Dest, const char* source) добавляет копию строки source, включая 0 -символ, в конец строки str. Dest. Начальный символ строки source записывается поверх 0 -символа в конце строки str. Dest. Функция возвращает указатель на начало результирующей строки str. Dest, которая заканчивается 0 -символом и должна иметь размер не менее strlen(str. Dest) + strlen(source) + 1 байтов. const int MAX = 80; char s 1[MAX] = "a"; char s 2[MAX] = "b"; cout << strcat(s 1, s 2) << endl; //ab warning C 4996: 'strcat' cout << s 1 << endl; //ab char* s; cout << (s= strcat(s 1, s 2))<< endl; //abb warning C 4996 was declared deprecated Функция errno_t strcat_s (char *str. Dest, size_t size. In. Bytes_str. Dest, const char *source); возвращает 0 при успешном завершении и код ошибки – в противном случае. char buf[16]; Шаблонная функция (только в С++) strcpy_s(buf, 16, "Start"); template strcat_s(buf, 16, " End"); cout << buf << endl; //Start End errno_t strcat_s( char (&str. Des)[size], const char *source ); позволяет вызывать функцию в привычном виде: const int MAX = 80; char s 1[MAX] = "a"; char s 2[MAX] = "b"; strcat_s(s 1, s 2); strcat_s(s 1, MAX, s 2); cout << s 1 << endl; //ab cout << s 1<< endl; //ab Л. В. Стрикелева Программирование 24 Стандартные функции работы со строками

Строки. Операции со строками Объединение строк Функция char* strncat (char* str. Dest, const char* Строки. Операции со строками Объединение строк Функция char* strncat (char* str. Dest, const char* source, size_t count) позволяет добавить не более чем count символов строки source в конец строки str. Dest и возвращает указатель на str. Dest. В строке str. Dest должно быть не менее strlen(str. Dest) + strlen(source) + 1 байтов. int count =2; const int MAX = 80; char s 1[MAX] = "aaa"; char s 2[MAX] = "bb"; strncat(s 1, s 2, count); //warning C 4996: 'strncat' was declared deprecated cout << s 1 << endl; //aaabb char *s_res = strncat(s 1, s 2, count); cout << s_res << endl; //aaabbbb Функция errno_t strncat_s (char *str. Dest, size_t size. In. Bytes_str. Dest, const char *source, size_t count) возвращает 0 при успешном завершении и код ошибки – в противном случае. const int MAX = 80; int count =2; char s 1[MAX] = "a"; char s 2[MAX] = "bbb"; strncat_s(s 1, MAX, s 2, count); cout << s 1<< endl; //abb Л. В. Стрикелева Программирование Шаблонная функция (только в С++) template errno_t strncat_s (char (&str. Dest)[size], const char *source , size_t count); позволяет вызывать функцию в привычном виде: int count=2; const int MAX = 80; char s 1[MAX] = "aaa"; char s 2[MAX] = "bbb"; strncat_s(s 1, s 2, count); cout << s 1 << endl; //aaabb 25 Стандартные функции работы со строками

Строки. Операции со строками Сравнение строк Функция int strcmp (char *s 1, const char Строки. Операции со строками Сравнение строк Функция int strcmp (char *s 1, const char *s 2) сравнивает строки s 1 и s 2 в лексикографическом (т. е. упорядоченном по алфавиту) порядке с учетом различия прописных и строчных букв (рассматриваются первые символы, если они одинаковы, то рассматриваются вторые символы, третьи и т. д. ). Функция возвращает 0, если строки равны; возвращает значение < 0, если первая строка меньше, чем вторая; и возвращает значение > 0, если первая строка больше, чем вторая. cout << strcmp("abc", "ABC")<< endl; // 1 cout << strcmp("ABC", "ABC")<< endl; // 0 cout << strcmp("ABB", "ABC")<< endl; // -1 Функция int strncmp (char *s 1, const char *s 2, size_t n) проводит сравнение только первых n символов двух строк: функция возвращает 0, если подстроки равны; возвращает значение < 0, если первая подстрока меньше, чем вторая; и значение > 0, если первая подстрока больше, чем вторая. int count=2; cout << strncmp("abc", "ABC", count)<< endl; // значение > 0 cout << strncmp("ABC", "abc", count)<< endl; // значение < 0 cout << strncmp("ABB", "ABC", count)<< endl; // 0 Л. В. Стрикелева Программирование 26 Стандартные функции работы со строками

Строки. Операции со строками Сравнение строк Функция int stricmp (char *s 1, const char Строки. Операции со строками Сравнение строк Функция int stricmp (char *s 1, const char *s 2) позволяет сравнивать строки s 1 и s 2 без учета регистра, т. е. без различия между прописными и строчными буквами. Она преобразует все буквы строк s 1 и s 2 в строчные буквы и сравнивает затем строки в лексикографическом порядке. cout << stricmp("abc", "ABC")<< endl; // возвращает 0 // warning C 4996: 'stricmp' was cout << stricmp("ABC", "ABC")<< endl; // возвращает 0 declared deprecated //warning C 4996 cout << stricmp("Ab", "ABC")<< endl; // возвращает значение < 0 // warning C 4996 cout << stricmp("ABd", "abc")<< endl; // возвращает значение > 0 // warning C 4996 Функция int _stricmp (const char *s 1, const char *s 2) работает аналогично, но уже не выдает предупреждений: cout << << _stricmp("abc", "ABC")<< endl; _stricmp("ABC", "ABC")<< endl; _stricmp("Ab", "ABC")<< endl; _stricmp("ABd", "abc")<< endl; // // возвращает 0 0 значение < 0 значение > 0 Стандартные функции работы со строками Л. В. Стрикелева Программирование 27

Строки. Операции со строками Сравнение строк Функция int strnicmp (char *s 1, const char Строки. Операции со строками Сравнение строк Функция int strnicmp (char *s 1, const char *s 2, size_t n) проводит сравнение только первых n символов двух строк без учета регистра, т. е. без различия между прописными и строчными буквами. cout << strnicmp("abc", "ABC", 2)<< endl; // возвращает 0 // warning C 4996: 'strnicmp' was declared deprecated cout << strnicmp("ABC", "Aa. C", 2)<< endl; // возвращает значение > 0 // warning C 4996 cout << strnicmp("Ab", "ABC", 2)<< endl; // возвращает 0 // warning C 4996 cout << strnicmp("ABd", "acc", 2)<< endl; //возвращает значение < 0 // warning C 4996 Функция int _strnicmp (const char *s 1, const char *s 2, size_t count) работает аналогично, но уже не выдает предупреждений: cout << << _strnicmp("abc", "ABC", 2)<< endl; _strnicmp("ABC", "Aa. C", 2)<< endl; _strnicmp("Ab", "ABC", 2)<< endl; _strnicmp("ABd", "acc", 2)<< endl; // возвращает 0 // возвращает значение > 0 // возвращает 0 //возвращает значение < 0 Стандартные функции работы со строками Л. В. Стрикелева Программирование 28

Строки. Операции со строками Поиск символа в строке Функция char * strchr (const char Строки. Операции со строками Поиск символа в строке Функция char * strchr (const char *s, int c) выполняет поиск символа с кодом c в строке s слева направо и возвращает указатель на позицию его первого вхождения в строку s. Если символа нет, то возвращается указатель NULL. 0 -символ также включается в поиск, поэтому функция может использоваться для поиска в строке позиции 0 -символа. const int MAX = 80; char c=''; char s 1[MAX]="ab cdef"; char * s= strchr(s 1, c); //указатель на символ if (s) cout<<" n =" << int(s-s 1) << endl; //n=2 - позиция символа Функция char * strrchr (const char *s, int c) выполняет поиск символа с кодом c в строке s справа налево и возвращает указатель на позицию его последнего вхождения в строку s. Если символа нет, то возвращается указатель NULL. 0 -символ также включается в поиск, поэтому функция может использоваться для поиска в строке позиции 0 -символа. const int MAX = 80; char c=''; char s 1[MAX]="ab cdef"; char *s= strrchr(s 1, c); if (s) cout<<" n =" << int(s-s 1) << Л. В. Стрикелева Программирование endl; //указатель на символ //n=2 - позиция символа Стандартные функции работы со строками 29

Строки. Операции со строками Проверка принадлежности символа некоторому множеству(<ctype. h>) int isdigit (int c) Строки. Операции со строками Проверка принадлежности символа некоторому множеству() int isdigit (int c) - возвращает отличное от 0 значение, если элемент с является цифрой, в противном случае – 0; int isalfa (int c) - возвращает отличное от 0 значение, если элемент с является буквой, в противном случае – 0; int isalnum (int c) - возвращает отличное от 0 значение, если элемент с является цифрой или буквой, в противном случае – 0; int isxdigit (int c) - возвращает отличное от 0 значение, если элемент с является 16 -ичной цифрой, в противном случае – 0; int islower (int c) - возвращает отличное от 0 значение, если элемент с является строчной буквой (нижний регистр), в противном случае – 0 int isupper(int c) - возвращает отличное от 0 значение, если элемент с является прописной буквой (верхний регистр), в противном случае – 0; int isspace (int c) - возвращает отличное от 0 значение, если элемент с является разделителем: переход на новую строку (‘n’), пробел (‘ ‘), переход на новую страницу (‘f’), горизонтальная табуляция (‘t’), вертикальная табуляция (‘v’), в противном случае – 0; int iscntrl (int c) - возвращает отличное от 0 значение, если элемент с является управляющим символом, в противном случае – 0; int ispunct (int c) - возвращает отличное от 0 значение, если элемент с является символом пунктуации, отличным от пробела, цифры или буквы, в противном случае – 0; int isprint (int c) - возвращает отличное от 0 значение, если элемент с является любым печатным символом, включая пробел, в противном случае – 0; int isgraph (int c) - возвращает отличное от 0 значение, если элемент с является печатным символом, отличным от пробела, в противном случае – 0; Л. В. Стрикелева Программирование 30 Стандартные функции работы со строками

Строки. Операции со строками Поиск строки в строке Функция char * strstr (char *s Строки. Операции со строками Поиск строки в строке Функция char * strstr (char *s 1, const char *search) выполняет поиск строки search в строке s 1 и возвращает указатель на первое вхождение search в строку s 1. Если строка не обнаружена, то возвращается указатель NULL. const int MAX = 80; char s 1[MAX]="abcdef", s 2[MAX]="cd"; char *s=strstr(s 1, s 2); if (s) cout<<" n =" << int(s-s 1) << endl; //n=2 - позиция строки Функция size_t strspn (const char *s 1, const char * char. Set) определяет и возвращает длину начальной части строки s 1, состоящей только из символов, содержащихся в строке char. Set. 0 -символ в сравнении не участвует. const int MAX = 80; char s 1[MAX]="abcdef", s 2[MAX]="aabb"; size_t n = strspn(s 1, s 2); //2 typedef unsigned size_t; Л. В. Стрикелева Программирование 31 Стандартные функции работы со строками

Строки. Операции со строками Поиск строки в строке Функция size_t strcspn (char *s 1, Строки. Операции со строками Поиск строки в строке Функция size_t strcspn (char *s 1, const char *char. Set) определяет и возвращает длину начальной части строки s 1, состоящей из символов, не содержащихся в строке char. Set. 0 -символ в сравнении не участвует. Если строка s 1 начинается с символа, встречающегося в строке char. Set, возвращается нуль. Если строка s 1 не содержит ни одного символа строки char. Set, возвращаемое значение совпадает с длиной строки s 1. const int MAX = 80; char s 1[MAX]="abcdef", s 2[MAX]="aabb"; size_t n = strcspn(s 1, s 2); //0 typedef unsigned size_t; Функция char * strpbrk (char *s 1, const char *s 2) возвращает указатель на символ, являющийся первым вхождением любого из символов строки s 2 в строку s 1. Если символ не найден, то возвращается указатель NULL. const int MAX = 80; char s 1[MAX]="abcdef", s 2[MAX]="cf"; char *s= strpbrk(s 1, s 2); cout << int(s-s 1) << endl; //2 Л. В. Стрикелева Программирование 32 Стандартные функции работы со строками

Строки. Операции со строками Преобразование строки в число (<stdlib. h>, cstdlib>) Преобразуемая в число Строки. Операции со строками Преобразование строки в число (, cstdlib>) Преобразуемая в число строка может содержать: • последовательность цифр; • запись вещественного числа в форме с фиксированной точкой или в экспоненциальной форме ( с наличием десятичной точки, цифр порядка и символов е или Е, например, 12. 345 Е- 2); • символы пробела, табуляции, знака числа. Признаком конца записи числа в преобразуемой строке является первый символ, который не может быть интерпретирован как символ числа соответствующего типа. Функция double atof (char *s) преобразует строку s, содержащую символьное представление вещественного числа, в соответствующее десятичное вещественное число; признаком конца числа служит первый символ, который не может быть интерпретирован как принадлежащий числу. char st[10]="1. 2 e 02. "; double d = atof(st); cout<

Строки. Операции со строками Преобразование строки в число (<stdlib. h>, cstdlib>) Функция long strtol Строки. Операции со строками Преобразование строки в число (, cstdlib>) Функция long strtol (const char *s, char **endptr, int base) преобразует строку s, содержащую символьное представление целого числа, в соответствующее десятичное длинное целое число в системе счисления base; признаком конца числа служит первый символ строки endptr, который не может быть интерпретирован как принадлежащий числу. #include int main() { const int MAX = 80; char str[MAX] = "a"; char *endptr; long il = strtol(str, &endptr, 2); cout <

Строки. Операции со строками Преобразование строки в число (<stdlib. h>, cstdlib>) Функция double strtod Строки. Операции со строками Преобразование строки в число (, cstdlib>) Функция double strtod (const char *s, char **endptr) преобразует строку s, содержащую символьное представление вещественного числа, в соответствующее десятичное вещественное число; признаком конца числа служит первый символ строки endptr, который не может быть интерпретирован как принадлежащий числу. #include int main() { const int MAX = 80; char str[MAX]="3. 1415", str 1[MAX]="3. 1415 e+00", str 2[MAX]="3. 14#00"; char *endptr; double d = strtod(str, &endptr); cout << d <<" " << endptr <

Строки. Преобразование числа в строку (<stdlib. h>, cstdlib>) Операции со строками Функция char * Строки. Преобразование числа в строку (, cstdlib>) Операции со строками Функция char * itoa (int i, char *s, int c) преобразует целое i (переведенное в с/с 2 _itoa_s(i, st, 10); errno_t _itoa_s (int value, char (*buffer)[ size], int cout<

Строки. Операции со строками Преобразование числа в строку (<stdlib. h>, cstdlib>) Функция char * Строки. Операции со строками Преобразование числа в строку (, cstdlib>) Функция char * ltoa (long il, char *s, int c) преобразует длинное целое il (переведенное в с/с 2

Строки. Операции со строками Преобразование числа в строку (<stdlib. h>, cstdlib>) Функция errno_t _ Строки. Операции со строками Преобразование числа в строку (, cstdlib>) Функция errno_t _ fcvt_s (char *buffer, size_t size. In. Bytes, double value, int count, int *dec, int *sign) возвращает 0 при успешном завершении и код ошибки – в противном случае. int drob=5, celoe, sign; char stroka[20]; double d=3. 141592; _fcvt_s( stroka, 20, d, drob, &celoe, &sign ); cout<< stroka <<" "<< celoe<<" "<< sign< errno_t _fcvt_s (char (*buffer)[ size], double value, int count, int *dec, int *sign); позволяет вызывать функцию в виде: int drob=5, celoe, sign; char stroka[20]; double d=3. 141592; _fcvt_s( stroka, d, drob, &celoe, &sign ); cout<< stroka <<" "<< celoe<<" "<< sign<

Строки. Операции со строками Пример применения функции преобразования #include <cstdlib> int main() { char Строки. Операции со строками Пример применения функции преобразования #include int main() { char a[ ] = "10) rost – 162 cm, ves – 59. 5 kg"; int num; long rost; double ves; num = atoi(a); //преобразование с символа 1 с индексом 0 и до символа ‘)’ rost = atol (&a[11]); //преобразование с символа 1 с индексом 11 и до ‘пробела’ ves = atof (&a[25]); //преобразование с символа 5 с индексом 25 и до ‘пробела’ cout << num << " " << rost << " " << ves; //10 162 59. 5 _getch(); return 0; } Стандартные функции работы со строками Л. В. Стрикелева Программирование 39

Строки. Операции со строками Преобразование строчных символов строки в прописные и наоборот int tolower Строки. Операции со строками Преобразование строчных символов строки в прописные и наоборот int tolower (int c) int toupper (int c) преобразует прописные латинские буквы в строчные преобразует строчные латинские буквы в прописные Функция char * strupr (char *s) преобразует символы строчных букв строки s в символы прописных букв и возвращает указатель на ее начало. const int MAX = 80; char str[MAX]="abcdef"; char * s; s = strupr(str); //warning C 4996: 'strupr' was declared deprecated cout< errno_t _strupr_s (char (*str)[ size]) позволяет вызывать функцию в виде: const int MAX = 80; char str[MAX]="abcdef"; _strupr_s(str); cout<

Строки. Операции со строками Стандартные функции работы со строками Преобразование строчных символов строки в Строки. Операции со строками Стандартные функции работы со строками Преобразование строчных символов строки в прописные и наоборот Функция char * strlwr (char *s) преобразует символы прописных букв строки s в символы строчных букв и возвращает указатель на ее начало. const int MAX = 80; char str [MAX]="ABCDEFG"; char * s; s = strlwr(str); //warning C 4996: 'strlwr' was declared deprecated cout< errno_t _strlwr_s (char (*str)[ size]); позволяет вызывать функцию в виде: const int MAX = 80; char str [MAX]="ABCDEFG"; _strlwr_s(str); cout<

Строки. Операции со строками Стандартные функции работы со строками реверс строки Функция char * Строки. Операции со строками Стандартные функции работы со строками реверс строки Функция char * strrev (char *s) возвращает указатель на начало строки, полученной в результате реверса строки s. заполнение строки символом Функция char * strset (char *s, int ch) помещает символ ch во все позиции строки s. прототип работа с блоками памяти описание функции копирует блок памяти из буфера-источника src в буфер dest, пока void *memccpy (void *dest, const void *src, int c, size_t n) общее число перенесенных байтов не достигнет значения n или пока не встретится в src байт, содержащий символ c возвращает указатель на символ c, найденный при просмотре n void *memchr (const void *s, int c, байтов буфера s; если символ не найден, возвращается NULL size_t n) int memcmp (const void *s 1, const void *s 2, size_t n) int memicmp (const void *s 1, const void *s 2, size_t n) void *memcpy (void *dest, const void *src, size_t n) void *memmove (void *dest, const void *src, size_t n) void *memset (void *s, int c, size_t n) Л. В. Стрикелева Программирование сравнивает n первых байтов буферов s 1 и s 2 (байты трактуются как символы); возвращает значение, меньшее нуля, если s 1 < s 2; равное нулю, если s 1= s 2; большее нуля, если s 1 > s 2 сравнивает n первых байтов буферов s 1 и s 2 (байты трактуются как символы, преобразованные в строчные буквы); возвращает значение, меньшее нуля, если s 1 < s 2; равное нулю, если s 1= s 2; большее нуля, если s 1 > s 2 копирует n байтов из буфера-источника src в буфер-назначение dest; буферы не должны перекрываться в памяти; возвращает указатель на dest копирует n байтов из буфера-источника src в буфер-назначение dest; буферы могут перекрываться в памяти; возвращает указатель на dest 42 устанавливает n байтов буфера s в заданное значение c; возвращается указатель на буфер s

Строки. Операции со строками Выделение лексем Стандартные функции работы со строками Последовательность вызовов функции Строки. Операции со строками Выделение лексем Стандартные функции работы со строками Последовательность вызовов функции strtok позволяет разбить строку на лексемы (предложения, слова). Функция возвращает из строки следующую лексему, отделенную заданным разделителем, и указатель на следующий символ, с которого должен осуществляться поиск очередной лексемы: #include int main() { char string[ ] = “this sentence; has-5 words. ”; char *token. Ptr; cout << string << endl << “by the words: ” << endl; token. Ptr = strtok (string, “ ; -. ”); //в виде литерала даны разделители: пробел ; - . while (token. Ptr != NULL) {cout << token. Ptr << endl; token. Ptr = strtok(NULL, “ ; -. ”); //при последующем вызове //нулевой указатель передается в качестве первого параметра } _getch(); return 0; } при включении в список разделителей символов, завершающих предложение (. ! ? ), в качестве лексем выделяются предложения, а при включении в список разделителей символов, разделяющих слова (пробел. , ; –), в качестве лексем выделяются слова !!! Функция strtok изменяет строку, разбиваемую на лексемы, поэтому Л. В. Стрикелева необходимо позаботиться о ее предварительном сохранении Программирование 43

Строки. Передача строки в функцию в качестве параметров Возможность выполнения в функции тех или Строки. Передача строки в функцию в качестве параметров Возможность выполнения в функции тех или иных действий со строкой зависит от описания аргумента, передаваемого в функцию (строкауказатель или строка-массив), и от спецификации формального параметра. Анализируйте описания строк в вызывающей функции и строк – формальных параметров и выбирайте последнее, в зависимости от действий, которые необходимо выполнить со строкой в функции. Рассмотрим сочетания разных описаний строк, которые могут выступать в качестве фактических и формальных параметров. Л. В. Стрикелева Программирование 44

Строки. Передача строки в функцию в качестве параметров #include <ctype. h> void convert. To. Строки. Передача строки в функцию в качестве параметров #include void convert. To. Uppercase (char *); int main() {char string [ ] = “aaaaaaa”; //string - константный указатель на // неконстантные данные cout << string <

Строки. Передача строки в функцию в качестве параметров #include <ctype. h> void convert. To. Строки. Передача строки в функцию в качестве параметров #include void convert. To. Uppercase (const char *s. Ptr); int main() { char string [ ] = “aaaaaaa”; //string - константный указатель на неконстантные данные cout << string <

Строки. Передача строки в функцию в качестве параметров #include <ctype. h> void convert. To. Строки. Передача строки в функцию в качестве параметров #include void convert. To. Uppercase (char *); int main() { char *s 1 = “pointer_of_simvol”; //s 1 - неконстантный указатель на константные данные cout << string <

Строки. Передача строки в функцию в качестве параметров #include <ctype. h> void convert. To. Строки. Передача строки в функцию в качестве параметров #include void convert. To. Uppercase (char *const); int main() {char string [ ] = "aaaaaaa"; //string – константный указатель на неконстнатные данные cout << string <

Строки. Передача строки в функцию в качестве параметров #include <ctype. h> void convert. To. Строки. Передача строки в функцию в качестве параметров #include void convert. To. Uppercase (const char *const, int); int main() {const int n=8; char string [n] = "aaaaaaa"; //string – константный указатель на неконстантные данные convert. To. Uppercase(string, n); _getch(); return 0; } void convert. To. Uppercase (const char *const s. Ptr, int n) { for ( int i=0; i

На сегодня все. До свидания До следующей встречи На сегодня все. До свидания До следующей встречи