Обробка символьних рядків в мові С++
План 1.Загальні відомості про рядковий тип даних. 2.Рядок як параметр функції.
1.Загальні відомості про рядковий тип даних. Символьні рядки організовуються як масиви символів, останнім з яких є символ \0, внутрішній код якого дорівнює нулю. Рядок описується як символьний масив. Наприклад: char STR[20]; Одночасно з описом рядок може ініціалізуватися. Можливі два способи ініціалізації рядка за допомогою рядкової константи і у вигляді списку символів: char S[10]="рядок"; char S[]="рядок"; char S [10] = {'р','я', 'д', 'о', 'к','\0'};
Можна визначити символьний масив і так: char S [10] = { 'р', 'я', 'д', 'о', 'к'}; тобто без нульового символу в кінці. Але це приведе до проблем з обробкою такого рядка, оскільки буде відсутній орієнтир на його закінчення. Окремі символи рядка ідентифікуються індексованими іменами. Наприклад, в описаному вище рядку S[0] ='р', S[4] ='к'. Обробка рядків зазвичай пов'язана з перебором всіх символів від початку до кінця. Ознакою кінця такого перебору є виявлення нульового символу.
Пример //Заміна символів рядка на зірочки #include void main() { char S[]="fh5j"; int i=0; clrscr () ; puts (S) ;// виведення рядка на екран while (S [i]) {S [i++] ='*'; puts(S); } printf("\n Dovzhina ryadka=%d",i); getch(); }
Серед стандартних бібліотек С/С++ існує бібліотека функцій для обробки рядків. Її заголовний файл string.h. strcat Формат функції: char *strcat(char *s1, char *s2); Функція додає s2 до s1 і повертає s1. У кінець результуючого рядка додається нуль-символ. strchr Формат функції: char *strchr(char *s, int ch); Функція повертає вказівник на перше входження символу ch в рядок s, якщо його немає, то повертається NULL.
strcmp Формат функції: int *strcmp(char *s1, char *s2); Функція порівнює рядки і повертає негативне (якщо s1 менше s2), нульове (якщо s1 рівне s2) або позитивне (якщо s1 більше s2) значення. strlen Формат фннкції: size_t strlen(char *s); Функція повертає довжину рядка (без урахування символу завершення рядка).
strcpy Формат функції: char *strcpy(char *sl, char *s2); Функція копіює s2 в s1 і повертає s1. strcspn Формат функції: size_t strcspn(char *s1, char *s2); Функція повертає значення індексу будь-якого з символів з s2 в рядку s1.
strspn Формат функції: size_t strspn(char *s1, char *s2); Функція повертає індекс першого символу в s1, відсутнього в s2. strstr Формат функції: char *strstr(char *s1, char *s2); Функція виконує пошук першого входження підрядка s2 в рядок s1. У разі вдалого пошуку, повертає вказівник на елемент з s1, з якого починається s2, і NULL інакше.
Приклад Ввести символьний рядок. Перевернути (обернути) цей рядок. Наприклад, якщо ввели рядок «abcdef», то в результаті в ній повинні отримати «fedcba». //Обернення рядка #include void main() { char C,S[10]; int i; clrscr(); printf("Vvedit ryadok "); gets(S) ; for(i=0; i<=(strlen(S)-1)/2 ; i++ ) { C=S[i] ; S[i]=S [strlen (S)-i-1] ; S[strlen(S)-i-1]=C;} printf("\nPerevernutiy ryadok:") ; puts(S); getch(); }
Рядок як параметр функції. Необхідно пам'ятати, що ім'я масиву є покажчик на його початок. Проте для рядків є одна істотна відмінність від масивів інших типів: ім'я рядка є покажчиком- змінною, і, отже, його значення може піддаватися зміні. Приклад Визначення функції обчислення довжини рядка (аналог стандартної функції strlen()). int length(char *s) { int k; for(k=0; *s++! = '\0 ' ; k++); return k;}
Приклад Програма обернення рядка у вигляді функції. //обернення рядка #include int length(char *str); void invers(char *str); void main() { char S[]=" "; clrscr(); printf("\n%s",S); invers(S);//виклик функції інвертування рядка printf("\n%s",S); getch(); } //функція обчислення довжини рядка int length(char *s) { int k; for(k= 0; *s++!='\0'; k++); return k; } //функція інвертування рядка void invers(char *e) { char c; int i,j,m; m=length(e); //виклик функції length for(i=0, j=m-1; i<j; i++, j--) { c=e[i]; e[i]=e[j]; e[j]=c; } }
Приклад Описати функцію вставки символу в рядок. Параметри функції: рядок, позиція вставки, символ, що вставляється. Використовувати цю функцію в основній програмі, де початковий рядок, номер позиції і символ, що вставляється, задаються введенням. // Вставка символу в рядок #include void INSERT(char *str, int p, char c) { int i; for(i=strlen(str); i>=p; i--) str[i+1]=str[i]; str[p]=c; } void main() { char c, S [100]; int n; clrscr(); puts("Vvedit ryadok:"); gets(S); puts("Vvedit poziciyu dlya vstavki:"); scanf("%d",&n); puts("Vvedit symbol:"); c=getche(); INSERT(S,n,c); puts("\nRezultat:"); puts (S); getch(); }