|
|||
Функции работы со строками.. Примеры программ ⇐ ПредыдущаяСтр 3 из 3 Функции работы со строками. Ниже приведены объявления и рассматриваются примеры наиболее часто используемых функций работы со строками [3,10,11]. А также рассматриваются примеры программ реализации некоторых из этих функций. Требуется отметить, что прототипы нижеприведенных функций располагаются в заголовочном файле <string.h>.
size_t strlen (const char *s) – возвращает длину в байтах строки s, не включая '\0'. char * strcat (char *dest, const char *src) – присоединяет строку src, в конец строки dest. char * strcpy (char *dest, const char *src) – копирует строку src в место памяти, на которое указывает dest. char * strncat (char *dest, const char *src, size_t maxlen) – присоединяет maxlen символов строки src в конец строки dest. char * strncpy (char *dest, const char *src, size_t maxlen) – копирует msxlen первых символов строки src в место памяти, на которое указывает dest. char * strstr (char *s1, const char *s2) – отыскивает первое вхождение строки s2 в строку s1. int strcmp (const char *s1, const char *s2) – сравнивает две строки в лексикографическом порядке с учетом различия прописных и строчных букв. Возвращает значение меньше 0, если s1 располагается в упорядоченном по алфавиту порядке раньше, чем s2, и больше, если наоборот. Функция возвращает нуль, если строки идентичны. char * stricmp (const char *s1, const char *s2) – аналогична strcmp, только не различает прописные и строчные буквы. Примеры программ Пример. Удалить из строки символов подстроку заключенную в [ ].
#include<stdio.h> #include<stdlib.h> #include<conio.h> void main() { char *ss; int i,j,k,n; scanf("%d",&k); ss=(char *)malloc(k); printf("введите строку символов "); fflush(stdin); // чистка входного буффера gets(ss); printf("\nИсходная строка символов : %s",ss);
j=-1; // позиция открывающей скобки '[' в строке for(i=0;*(ss+i);i++) // цикл прохода по строке до ее конца { if (*(ss+i)=='[') // скобка найдена { j=i; while(*(ss+ ++j)!=']' && *(ss+j)!='[' && *(ss+j)); if (*(ss+j)=='[') i=j-1; // позиция вложенной скобки [ (теперь // основной) // во внешнем цикле по i увеличится значние i else if(*(ss+j++)==']') // позиция закрывающей скобки { n=i;
while(1) if(!(*(ss+n++)=*(ss+j++))) break; //сжатие строки (удаление // подстроки) i--; // после сжатия надо проверить первый из символов // сдвинутых на [...] не является ли он сам [ } } } printf("\nCжатая строка символов : %s",ss); }
Пример. Ввести символьную строку и выполнить в ней удаление предпоследнего слова. Слова в строке разделены одним пробелом.
#include <stdio.h> #include <stdlib.h> main() { int kk,k,n; char *s; puts("введите длину строки "); scanf("%d",&n); s=(char*)malloc(n); if(!s) return 0; // ошибка выделения памяти fflush(stdin); // чистка входного потока puts("введите строку: "); gets(s); puts("исходная строка: "); puts(s); k=0; while(*(s+k)) k++; // переход в конец строки. k – позиция ‘\0’ while(*(s+k)!=' ') k--; // позиция пробела перед последним словом kk=k--; // запоминаем в kk позицию пробела и сдвиг на // последний символ предпоследнего слова в строке while(*(s+k)!=' ') k--; // позиция пробела перед предпоследним словом while(*(s+ ++k)=*(s+ ++kk)); // удаление предпоследнего слова (запи- // сываем на его место последнее слово) puts("преобразованная строка: "); puts(s); }
Пример. Ввести символьную строку и выполнить в ней замену местами последнего и предпоследнего слов.
#include <stdio.h> #include <stdlib.h> main() { int kk,k,n; char *s,*s1,t; scanf("%d",&n); s=(char*)malloc(n); // выделение памяти без инициализации s1=(char*)calloc(n,1); // выделение памяти с инициализацией if(!s||!s1) return 0; fflush(stdin); gets(s); k=0; while(*(s+k)) k++; // переход в конец строки. k – позиция ‘\0’ while(*(s+k)!=' ') k--; // позиция пробела перед последним словом k--; while(*(s+k)!=' ') k--; // позиция пробела перед предпоследним словом kk=++k; // запоминаем позицию первого символа этого слова n=0; // перезапись в строку s1 предпоследнего слова while(*(s+k)!=' ') *(s1+n++)=*(s+k++); k++; // запись последнего слова на предпоследнее while(*(s+k)) *(s+kk++)=*(s+k++); *(s+kk++)=' '; // вставка пробела после слова n=0; // дозапись слова из строки s1 while(*(s+kk++)=*(s1+n++)); printf("%s",s); free(s); free(s1); // освобождение памяти }
Пример. Рассмотрим еще один пример программы замены двух соседних слов в строке без использования дополнительных строк. Пусть например необходимо выполнить местами первого и второго слов.
#include<stdio.h> #include<stdlib.h> void main() { char *str,c; int i,i1,i2,j,j1,j2,n; printf("введите длину строки символов "); scanf("%d",n); printf("\nвведите строку символов "); if ((str=(char *)malloc(n))==NULL) {puts("нет свободной памяти"); return;} fflush(stdin); // чистка входного буффера gets(str); printf("\nИсходная строка : %s",str); i=0; while(*(str+i)==' ') i++; // пропуск пробелов вначале строки i1=i; // начало первого слова while(*(str+i)!=' ') i++; i2=i-1; // конец первого слова while(*(str+i)==' ') i++; // пропуск пробелов вначале строки j1=i; // начало второго слова while(*(str+i)!=' ') i++; j2=i-1; // конец второго слова
for(i=0;i<i2-i1+1;i++) // замена первого слова и *(str+j1-1-i)=*(str+i2-i); for(i=0;i<j1-i2-1;i++) // пробелов за ним местами *(str+i1+i)=' ';
for(j=i1;j<j1;j++) // число повторов циклического сдвига { c=*(str+i1); // запоминаем символ i1 позиции for(i=0;i<j2-1;i++) // сдвиг на 1 позицию влево *(str+i1+i)=*(str+i1+i+1); *(str+j2)=c; // перенос символа в позицию j2 } printf("\nПреобразованная строка : %s",str); }
Пример. Создать массив указателей на слова для каждой вводимой строки. Строка может содержать до 10 слов. Используя массив указателей исключить из каждой строки cлово с максимальной длинной.
#include <stdio.h> #include <stdlib.h> #define size 2 void fff(char *,char *); void main() { char *st[size][10],*mst,*pst; int i,j,n=0,k=0,kk=0; n=0; do { st[n][0]=(char *)malloc(20); // выделение памяти под строку gets(st[n][0]); // ввод строки } while(*st[n++][0]); n--; for(i=0;i<n;i++) { k=0; for(j=0; *(st[i][0]+j); j++) if(*(st[i][0]+j)==' ') // найден пробел - конец слова st[i][++k]=st[i][0]+j+1; // адрес начала слова st[i][++k]=st[i][0]+j+1; // адрес ’\0’ (для последнего слова) for(; k<9; ) st[i][++k]=NULL; // остальные адреса для слов в строке } for(i=0; i<n; i++) // перебор строк for(j=0; st[i][j]; j++) // перебор слов в строке fff(st[i][j],st[i][j+1]); // сравнение 2 слов для поиска max
for(i=0; i<n; i++) puts(st[i][0]); }
void fff(char *st1,char *st2) { int i; static j; static char *k; j=(st2-st1>j) ? k=st1,j=st2-st1 : j; // j - длина максимального слова // k - указатель на начало этого слова if (!st2) // передано не одно слово { for(; j>0; j--) { for(i=0; *(k+i+1); i++) *(k+i)=*(k+i+1); // сдвиг строки на позицию max слова *(k+i)='\0'; } } }
Пример. Ввести символьную строку и найти в ней слово максимальной длины.
#include <stdio.h> #include <stdlib.h> #include <conio.h> main() { char *st; int i,k,kk=0,i1,i2,i3,size; printf("Введите длину строки"); scanf("%d",&size); st=(char *)malloc(size); fflush(stdin); gets(st);
i=i1=i2=0; while(*(st+i)) { i3=i; // индекс начала слова в строке for(k=0; *(st+i)!=' ' && *(st+i); i++,k++); if(kk<k) { kk=k; i1=i3; i2=i; } // координаты max слова if(*(st+i)==' ') while(*(st+(++i))==' '); //удаление повторных //пробелов } puts("\nслово max длины "); for(i=i1; i<i2; printf("%c",*(st+i++))); }
Пример . Ввести строку и выполнить в ней замену слова с минимальной и максимальной длинной.
#include<stdio.h> #include<conio.h> #include<stdlib.h> main() { char c,*s,*s1,*s2; int i,n,nn,min,max,i1,i2,l,i3,i4; clrscr(); puts(""); scanf("%d",&nn); s=(char*)malloc(nn); s1=(char*)calloc(nn,1); s2=(char*)calloc(nn,1); if(!s||!s1||!s2) return 0; fflush(stdin); gets(s); i=i1=i2=0; min=nn; max=0; while(*(s+i)) { for(n=0;*(s+i)!=' ' && *(s+i); i++,n++); if(max<n) { max=n; i1=i-n; } if(min>n) { min=n; i3=i-n; }
if(*(s+i)==' ') while(*(s+(++i))==' '); } l=0; i=i1; while(*(s+i)!=' ' && *(s+i)) *(s1+l++)=*(s+i++);
l=0; i=i3; while(*(s+i)!=' ' && *(s+i)) *(s2+l++)=*(s+i++);
l=0; if(i1<i3) { i2=i1+max; while(*(s2+l)) *(s+i1++)=*(s2+l++); while(i2<i3) *(s+i1++)=*(s+i2++); l=0; while(*(s1+l)) *(s+i1++)=*(s1+l++); } else { i=i1+max-min; while(*(s2+l)) *(s+i++)=*(s2+l++); i2=i-min-1; i1--; while(i1>=i3+min) *(s+i2--)=*(s+i1--); l=0; while(*(s1+l)) *(s+i3++)=*(s1+l++); } puts(s); free(s); free(s1); free(s2); } Пример . Ввести строки. Определить, какие строки из введенных читаются одинаково из начала в конец и наоборот
#include <stdio.h> #include <conio.h> void main() { char mas[20][20]; int i,n,length,j; clrscr(); printf("Сколько строк вы хотите ввести: "); scanf("%d",&n); for (i=0;i<n;i++) { fflush(stdin); gets(mas[i]); } // ввод n строк printf("\n\n"); for (i=0;i<n;i++) { length=0; j=0; while (mas[i][j]) { length++; j++; } // подсчитываем длину i строки for (j=0;j<length/2;j++) // проверяем необходимое условие if (mas[i][j]!=mas[i][length-1-j]) break; if (mas[i][j]==mas[i][length-1-j]) puts(mas[i]); // найдена // искомая строка } }
|
|||
|