Выделение слов организуется на основе
поиска разделителей слов – пробелов, точек, запятых и т.п. Если разделители
расположены до начала слова, они пропускаются. Указатель *ptr[i] ( i –
номер слова) устанавливается на первый не разделитель – начало слова (Таблица 3.1). Затем происходит поиск разделителя
в конце слова. Он заменяется на ноль ‘\0’. Все изложенные процедуры по
выделению следующего слова повторяются до тех пор, пока не будет достигнут конец
обрабатываемой строки. Запись нулей в исходную строку модифицирует ее и, если
строка нужна в оригинале, ее следует предварительно сохранить.
Таблица 3.1
Адрес
|
|
Ptr[0]
|
|
|
|
|
Ptr[1]
|
|
|
Ptr[2]
|
|
|
Строка
|
|
q
|
w
|
e
|
|
|
t
|
y
|
|
r
|
t
|
\0
|
Дополнение
|
|
|
|
|
\0
|
|
|
|
\0
|
|
|
|
//Пример программы выделения слов
char St[21]="";// 20 символов и \0
int k,i=0;
cout<<RUS("Введите строку:");
gets(St);
k=strlen(St);
cout<<RUS("\nДлина строки = ")<<k;
char *Delimiters =
" .!?,;:\"'/0123456789@#$%^&*()<>{}[]~+-=";
char *ptr[20];
int x=0;bool
prDelim=true;
ptr[i]=St;
do
{do
{
while
((*ptr[i]!=Delimiters[x])&&(Delimiters[x]!='\0')) x++;
if (Delimiters[x]!='\0') ptr[i]++;
}
while (Delimiters[x]!='\0');
i++;ptr[i]=ptr[i-1];//найдено начало слова
for(;;)
{
ptr[i]++;if (*ptr[i]=='\0') {prDelim=false;break;}//найден конец строки
x=0;
while
((*ptr[i]!=Delimiters[x])&&(Delimiters[x]!='\0')) x++;
if (Delimiters[x]!='\0')
{*ptr[i]='\0';ptr[i]++;prDelim=true;break;}//найден конец слова
}
}
while (prDelim);
for(int
j=0;j<i;j++)cout<<'\n'<<ptr[j];//вывод массива слов
В библиотеке string.h есть функция выделения слова strtok(St,Delimiters). Она выделяет одно слово
строки St по перечню
разделителей Delimiters.
Если нужно выделить последующие слова, функцию используют с параметром NULL вместо St. Тогда она продолжает выделять слова
в строке St. По завершению
всех слов функция возвращает ноль и это
следует использовать для выхода из цикла выделения.
char St[21]="";//
20 символов и \0
int k,i=0;
cout<<RUS("Введите строку:");
gets(St);
strrev(St);
puts(St);
k=strlen(St);
cout<<RUS("\nДлина строки = ")<<k;
char *Delimiters =
" .!?,;:\"'/0123456789@#$%^&*()<>{}[]~+-=";
char *ptr[20];
ptr[i] = strtok(St,
Delimiters);//выделение первого слова
while(ptr[i])
{i++;
ptr[i] = strtok(NULL,Delimiters );// выделение следующего слова
}
for(int
j=0;j<i;j++)cout<<'\n'<<ptr[j];//вывод массива
При выводе:
если обращение как ptr[j] – вывод слова полностью
если обращение как *ptr[j] – вывод 1-го символа слова
если обращение как *(ptr[j]+1) – вывод 2-го символа
слова
если обращение как *(ptr[j] +n) – при n> длины слова выводятся буквы
следующего слова
Сортировка осуществляется пузырьковым
методом, рассмотренным в п. 1.1.1. Для проверки правильности в приложении I приведена таблица кодов
символов по стандарту ASCII.
Сортировать символы в строке не имеет смысла, поэтому рассмотрим программу
сортировки слов по начальной букве. Программа является дополнением к программе
предыдущего раздела по выделению слов. На начало каждого слова указывает
переменная ptr[i].
…
int N=i;//N-число слов
char* t;
for(int
j=0;j<N;j++)
strlwr(ptr[i]); //преобразование к строчным
буквам
for(int i=N-1;i>0;i--) //начало
сортировки
for(int j=0;j<i;j++)
if(*ptr[j]>*ptr[j+1])
{
t=ptr[j];
ptr[j]=ptr[j+1];
ptr[j+1]=t;
}; //конец
сортировки
for(int
j=0;j<N;j++)cout<<'\n'<<ptr[j];//вывод массива
Для сортировки по второй букве необходимо
повторить процедуру внутри рядов с одинаковыми первыми буквами. Так что,
предварительно нужно вычислить количество слов по каждой букве… Читателю
предлагается самому разработать пример такой программы.
|