- •2.2.Функции, возвращающие значение
- •Void main ()
- •Void Sum(float *s,float *X, int n)
- •Void main ()
- •Void Sumstmatr ( float (*mz)[m], float *mx, int n1, int m1); //прототип функции Sumstmatr
- •Void main ()
- •Void Sumstmatr (float (*mz)[m], float *mx, int n1, int m1)
- •Void main ()
- •Void main()
- •2.3. Функции обработки строк
- •Void strcpy ( char *s, char *t)
- •Void strcpy ( char *s, char *t)
- •Int strcmp ( char * s, char * t)
- •Unsigned strlen (const char *str );
- •Void strcpy (char *s,char *t);
- •Void main ()
- •Int Vs(char *s, char *sl, int d);
- •Int Vs(char *s,char *sl, int d) // функция формирования очередной строки
- •2.4. Рекурсивные функции
- •Void main()
- •3.Классы памяти и области действия описаний
- •Автоматические переменные
- •Внешние переменные
- •Void main ()
- •Void main ()
- •Int a[4]; // указано, что а – локальный массив целого типа
- •Void main ()
- •Статические переменные
- •Void f();
- •Void main ()
- •Void f()
- •Регистровые переменные
- •4.Элементы структурного программирования
- •4.1.Нисходящая разработка
- •4.2.Основные структуры, пошаговая детализация
- •Void main ()
- •Void main ()
- •Void Smog (long mz[][n2]);
- •Void main ()
- •Void Smog (long mz[][n2])
- •4.3.Сквозной структурный контроль
- •Элементы, которые должны проверяться на контрольных сессиях
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>,
а
Введите текст:
Вера
Надежда Любовь
Вы ввели текст:
Вера
Надежда Любовь РЕЗУЛЬТАТ:
Вера
Надежда
Любовь
Недовольный читатель скажет: “ А зачем нам такие хлопоты? Ну и хранился бы себе исходный текст в поле 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указывает максимально допустимое количество символов в строке, соответствующей выделяемому слову. Рассмотренная программа будет использоваться нами при решении задач, связанных с обработкой строк.