Примеры программ к Лабораторной работе N11. "Указатели на функции"
// func_ptr.c - использование указателей на функции
#include <stdio.h>
#include <string.h>
#include <ctype.h>
char showmenu (void) ;
void eatline (void) ; // читать до конца строки
void show(void (* fp)(char *), char * str);
void ToUpper(char *); // преобразовать строку к верхнему регистру
void ToLower(char *); // преобразовать строку к нижнему регистру
void Transpose(char *); // перестановка регистров
void Dummy(char *); // строка остается неизменной
int main(void) {
char line [81];
char copy [81];
char choice;
void (*pfun)(char *); // указывает на функцию, которая использует
// значение типа char * в качестве аргумента
// и не имеет возвращаемого значения
puts("Введите строку (пустая строка - выход из программы):");
while (gets(line) != NULL && line[0] != '\0') {
while ((choice = showmenu()) != 'n') {
switch (choice) // установка указателя
{
case 'u' : pfun = ToUpper; break;
case 'l' : pfun = ToLower; break;
case 't' : pfun = Transpose; break;
case 'o' : pfun = Dummy; break;
}
strcpy(copy, line); // копия для функции show()
show(pfun, copy); // используется избранная функция
}
puts("Введите строку (пустая строка - выход из программы):");
}
puts("Всего доброго!");
return 0;
}
char showmenu (void){
char ans;
puts("Введите номер выбранного элемента меню:");
puts("l) нижний регистр u) верхний регистр");
puts("t) перестановка регистров о) исходный регистр");
puts("n) следующая строка");
ans = getchar(); // ввод ответа
ans = tolower(ans); // перевод в нижний регистр
eatline(); // удаление оставшейся части строки
while (strchr ("ulton", ans) == NULL){
puts("Пожалуйста, введите u, 1, t, о или n:");
ans = tolower (getchar ()) ;
eatline();
}
return ans;
}
void eatline(void){
while (getchar() != '\n')
continue;
}
void ToUpper(char * str){
while (*str){
*str = toupper(*str);
str++;
}
}
void ToLower(char * str){
while (*str){
*str = tolower(*str);
str++;
}
}
void Transpose(char * str) {
while (*str) {
if (islower (*str))
*str = toupper (*str);
else if (isupper(*str))
*str = tolower (*str) ;
str++;
}
}
void Dummy(char * str){
// оставляет строку неизменной
}
void show(void (* fp)(char *), char * str) {
(*fp)(str); // применяет избранные функции к строке str
puts(str); // отображает результат
}