Необходимо написать программу, которая с помощью указателей на функцию выполняет задание по варианту

В заданной строке нужно найти и вывести:

  1. сумму встречающихся цифр;
  2. количество слов в строке;
  3. самое длинное слово;
  4. все положительные числа.

В моём далеко неполном коде я написал в main циклы для суммы цифр и количества строк, а также поиск самого длинного слова. Первые 2 функции работают нормально, с поиском максимального слова проблемы, а как найти и вывести положительные числа - этого у меня сделать не получилось вовсе. В общем, кто сможет - переделайте эту программу, используя указатели на функции и подайте идею для нахождения и вывода положительных ЧИСЕЛ, заранее большое спасибо.

    #include <stdio.h>
    #include <string.h>
    #include <locale.h>
    
    int st_len(char* st)
    {
        int n = 0;
        for (; st[n] != '\0'; n++);
        return n;
    }
    
    int main()
    {
        setlocale(LC_ALL, "ru");
        char str[10000];
        int sum = 0, count, flag, id, count1, max, len, i = 0;
        gets_s(str);
    
        
        
        for (int i = 0; i < st_len(str); i++)
        {
            if ((str[i] >= '1') && (str[i] <= '9'))
            {
                sum += ((int)str[i] - 48);
            }
        }
        printf("Сумма цифр - %d\n", sum);
    
        
    
        count = 0;
        flag = 0;
        for (int i = 0; str[i] != '\0'; i++)
            if (str[i] != ' ' && flag == 0) {
                count += 1;
                flag = 1;
            }
            else
                if (str[i] == ' ') flag = 0;
        printf("Количество слов - %d\n", count);
    
        
        max = 0;
        id = 0;
        count1 = 0;
        len = st_len(str);
        for (int i = 0; i < len; i++)
            if (str[i] != ' ' && str[i] >= 'a' && (str[i] <= 'z') || (str[i] >= 'A') && (str[i] <= 'Z'))
                count1 += 1;
            else
            {
                if (count1 > max)
                {
                    max = count1;
                    id = i - count1; 
                }
                count1 = 0;
            }
        if (count1 > max) 
        {
            max = count1;
            id = i - count1;
        }
        max += id;
        printf("Самое длинное слово - ");
        for (i = id; i < max; i++)
        {
            printf("%c", str[i]);
        }
        printf("\n");
        return 0;}

Ответы (1 шт):

Автор решения: Павел Ериков

Вот пример кода с комментариями:

Функция main:

int main() {
setlocale(LC_ALL, "ru");
char str[10000];
gets_s(str);

printf("1. Вывести сумму встречающихся цифр\n");
printf("2. Количество слов в строке\n");
printf("3. Самое длинное слово\n");
printf("4. Все положительные числа\n");

int choose;
printf("Введите код операции: ");
scanf("%d", &choose);

void (*func)(char* str) = NULL;

if (choose == 1) func = summaDigits;
else if (choose == 2) func = countWords;
else if (choose == 3) func = maxLenghtWord;
else if (choose == 4) func = inputPositiveNumbers;

if(func != NULL)
    func(str);
return 0;
}

Функции по условию:

//Ваша функция - ничего не менял
void summaDigits(char* str) {
    int sum = 0;
    for (int i = 0; i < st_len(str); i++)
    {
        if ((str[i] >= '1') && (str[i] <= '9'))
        {
            sum += ((int)str[i] - 48);
        }
    }
    printf("Сумма цифр: %d\n", sum);
}
//Ваша функция - ничего не менял
void countWords(char* str) {
    int count = 0;
    int flag = 0;
    for (int i = 0; str[i] != '\0'; i++)
        if (str[i] != ' ' && flag == 0) {
            count += 1;
            flag = 1;
        }
        else
            if (str[i] == ' ') flag = 0;
    printf("Количество слов: %d\n", count);
}
//Функция вывода самого длинного слова в строке
void maxLenghtWord(char* str) {
    int max = 0; 
    int len = st_len(str);
    int count = 0;
    int maxIndex = 0;
    for (int i = 0; i < len; i++) {
        count = 0;
        //Доходим до пробела считая длину слова
        for (; i < len && str[i] != ' '; i++, count++);
        //Проверяем на максимум
        if (count > max) {
            max = count;
            maxIndex = i - count;
        }
    }
    //Выводим
    printf("Самое длинное слово: ");
    for (int i = maxIndex; i < maxIndex + max; i++)
        printf("%c", str[i]);
    printf("\n");
}
//Вывод всех положительных чисел в строке
void inputPositiveNumbers(char* str) {
    int len = st_len(str);
    int index = 0;
    for (int i = 0; i < len; i++) {
        //Начало числа
        index = i;
        //ищем конец числа
        for (; i < len && str[i] >= '0' && str[i] <= '9'; i++);

        //Проверяем чтобы слева от числа и справа были пробелы
        //цифры не в другом слова и нет минуса в начале
        if ((index == 0 || str[index - 1] == ' ') && (str[i] == ' ' || i == len)) {
            for (int j = index; j < i; ++j)
                printf("%c", str[j]);
            printf(" ");
        }
    }
}

Функцию st_len так же не менял.

→ Ссылка