Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
11
Добавлен:
09.04.2015
Размер:
232.96 Кб
Скачать

Int Vs(char *s, char *sl, int d);

main ( )

{ char *ss[n]; //массив указателей на выделенные слова (строки) Си

char text[n]; //массив для исходного текста

int k,l;

char ch, *p;

clrscr();

puts ("Введите текст:\n");

gets(text);

puts("Вы ввели текст: ");

puts(text);

k=0;

l=0;

// цикл по анализу символов исходного текста printf(“\n РЕЗУЛЬТАТ: \n”);

while (text[l]!='\n'&& text[l]!='\0'&& l<n )

{ ch=text[l];

if (ch != ' ' && ch!='\t')

{ ss[k]=new char[n];// выделение памяти для очередного слова

l+=Vs(ss[k], &text[l], n);

puts(ss[k]);

k++;

}

else l++;

}

getch();

return 0;

}

Int Vs(char *s,char *sl, int d) // функция формирования очередной строки

{ int i, N;

N=0;

// цикл по выделению очередного слова

while (*sl!=' '&& *sl!='\0' && *sl!='\t'&&*sl!='\n')

{ *s=*sl;

s++;

sl++;

N++;

} // цикл по завершению формирования строки Си для // очередного слова

for( i=N; i<d; i++ )

{ *s='\0';

s++;

}

return N;

}

Если выполнить эту программу, определив n=25 ( оператором # define n 26) и при вводе нажать клавиши: <В><е><р><а><пробел><пробел><пробел><пробел><Н><а><д><е><ж><д><а> <пробел><пробел><Л><ю><б><о><в><ь><Enter>, в поле text, длиною в 16 байт, будет хранится следующая информация: <В><е><р><а> <' '> <' '> <' '> <' '> <Н><а><д><е><ж><д><а> < ' ' > < ' ' > <Л><ю><б><о><в><ь> <\n> <?> <?> <?>, где ' '–код пробела, а ?– обозначение байта, содержимое которого не определено, т. е. в котором содержится «мусор».

После обработки в поле ss[0] получим: <В><е><р><а><\0><\0><\0><\0><\0><\0><\0><\0><\0><\0><\0><\0><\0><\0><\0><\0> <\0><\0><\0><\0><\0><\0>, в поле ss[1] получим: <Н><а><д><е><ж><д><а><\0><\0><\0><\0><\0><\0><\0><\0><\0><\0><\0><\0><\0> <\0><\0><\0><\0><\0><\0>,

а

Введите текст: Вера Надежда Любовь Вы ввели текст: Вера Надежда Любовь

РЕЗУЛЬТАТ: Вера Надежда

Любовь

в полеss[2] получим: <Л><ю><б><о><в><ь><\0><\0><\0><\0><\0><\0><\0><\0><\0><\0><\0><\0><\0><\0> <\0><\0><\0><\0><\0><\0>. На экране мы увидим:

Недовольный читатель скажет: “ А зачем нам такие хлопоты? Ну и хранился бы себе исходный текст в поле text. Там бы и проводили любую обработку!”. Но, дело в том, что в результате предложенной нами обработки мы получили каждое слово в отдельном поле и эти слова оформлены как строки в Си. Последнее обстоятельство позволяет далее обрабатывать эти слова, используя всю мощь стандартной библиотеки Си для последующей обработки этих слов.

В этой программе переменная l используется для хранения номера текущего символа обрабатываемого текста, а переменнаяк используется для хранения номера текущего слова. В цикле по l проверяется каждый символ (while (text[l]!='\n'&& text[l]!='\0'&& l<n )). Как только этот символ будет отличен от пробела и символа табулирования (if (ch != ' ' && ch!='\t')), то выделяется память для очередного слова (ss[k]=new char[n];), а затем вызывается функция выделения этого слова (l+=Vs(ss[k], &text[l], n);). ФункцияVs пересылает это слово по адресуss[k], и возвращает длину соответствующей строки в оператор присваивания, который «переставляетl » напервый символ, являющийся пробелом или символом табулирования. Параметрnуказывает максимально допустимое количество символов в строке, соответствующей выделяемому слову. Рассмотренная программа будет использоваться нами при решении задач, связанных с обработкой строк.

Соседние файлы в папке attachments_05-09-2012_18-55-54