Есть такое задание: дана символьная строка. Найти максимальное по длине слово

Слова разделяются знаками препинания, пробелами. Доп. условие: нельзя использовать дополнительные массивы. Нужна помощь со следующим: 1)вместо char s[100] выделить память динамически; 2)вплотную и рядом стоящие цифры не считаются за длину слова (сделать проверку на это условие. например, при вводе 12hello 12 abcd программа должна вывести только hello). Заранее большое спасибо всем, кто окажет помощь.

#include <stdio.h>
#include <string.h>
int main() {
    char s[100];
    int i, id, max, count, len;
    gets_s(s);
    len = strlen(s);
    max = 0;
    id = 0;
    count = 0;
    for (i = 0; i < len; i++)
        if (s[i] != ' ') count += 1;
        else {
            if (count > max) {
                max = count;
                id = i - count;
            }
            count = 0;
        }

    if (count > max) {
        max = count;
        id = i - count;
    }
    max += id;
    for (i = id; i < max; i++)
        putchar(s[i]);
    printf("\n");
}

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

Автор решения: Zhihar

например так можно, как мне кажется

char* text = new char[10240];

// получить размер строки
const int len = strlen(text);

// найти слово максимальной длины (размер слова и его позицию в строке)
int max_word_len = 0;
int max_word_pos = 0;

int word_len = 0;
int word_pos = 0;

// пройтись по строке (условие <= выбрано для того, чтобы не выносить проверки дополнительно за цикл, а все делать внутри цикла, '\0' не является буквой и означает, что слово закончилось)
for (int i = 0; i <= len; i++) {

    word_len++;

    // получить очередной символ из строки
    const char letter = text[i];

    // если символ входит в диапазон 'a'...'z', 'A'..'Z', т.е. является буквой
    if ((letter >= 'a') && (letter <= 'z') || (letter >= 'A') && (letter <= 'Z')) {
        // если позиция слова нулевая (т.е. текущее слово только начинает обходиться, то задать его текущую позицию иначе не трогать
        word_pos = (word_pos == 0) ? i : word_pos;
    }
    else {
        // если символ - не буква, то значит слово закончилось и необходимо проверить его на максимальный размер
        if (word_len > max_word_len) {
            max_word_len = word_len;
            max_word_pos = word_pos;
        }

        // сбросить параметры слова
        word_len = 0;
        word_pos = i;
    }
}
→ Ссылка