Распечатать все самые длинные слова предложения - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Словом назовем всякую последовательность букв латинского алфавита длины не более 20. Пред- ложением — всякую последовательность не более 30 слов, разделенных одним или несколькими пробе- лами, оканчивающуюся символом ‘.’, ‘!’ или ‘?’. Написать программу, читающую заданное предложение, контролирующую его правильность и выполняющую функцию, которая: распечатывает все самые длинные слова предложения; помогите... можно не делать контроль над правильностью предложения, главное чтобы самые длинные слова выводило...

Решение задачи: «Распечатать все самые длинные слова предложения»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
 
typedef struct WORDSSTACK {
    char ** words;
    int capacity;
    int top;
} wordsstack_t;
 
wordsstack_t * ws_new(int cap) {
    wordsstack_t * ws = malloc(sizeof(wordsstack_t));
    assert ( ws );
    ws->capacity = cap;
    assert ( ws->words = malloc(sizeof(char*) * ws->capacity) );
    ws->top = 0;
    
    return ws;
}
 
void ws_delete(wordsstack_t * ws) {
    assert ( ws );
    free(ws->words);
    free(ws);
}
 
int ws_empty(wordsstack_t * ws) {
    assert ( ws );
    return ( ws->top == 0 );
}
 
int ws_full(wordsstack_t * ws) {
    assert ( ws );
    return ( ws->top == ws->capacity );
}
 
void ws_push(wordsstack_t * ws, char * word) {
    assert ( ! ws_full(ws) );
    ws->words[ws->top++] = word;
}
 
char * ws_pop(wordsstack_t * ws) {
    assert ( ! ws_empty(ws) );
    return ws->words[--(ws->top)];
}
 
void push_longest_words(char * str, const char * delim, wordsstack_t * ws) {
    static int maxlen;
    
    if ( str )
        maxlen = 0;
    
    if ( str = strtok(str, delim) ) {
        int len = strlen(str);
        if ( len > maxlen )
            maxlen = len;
        push_longest_words(NULL, delim, ws);
        if ( len == maxlen )
            ws_push(ws, str);
    }
}
 
/****************************************************************/
 
#define TEXT_LENGTH (2048)
#define MAX_WORDS (256)
#define SENTENCE_BREAKS ".!?"
#define WORD_BREAKS " ,\t\n"
#define SEP_LINE "**************************************************"
 
/****************************************************************/
 
int main(void) {
    char text[TEXT_LENGTH], * pSentence, * pNext;
    wordsstack_t * ws;
    
    ws = ws_new(MAX_WORDS);
    
    while ( printf("Text: ") && fgets(text, TEXT_LENGTH, stdin) && *text != '\n' ) {
        for ( pSentence = strtok_r(text, SENTENCE_BREAKS, &pNext); pSentence; pSentence = strtok_r(NULL, SENTENCE_BREAKS, &pNext) ) {
            push_longest_words(pSentence, WORD_BREAKS, ws);
            printf("%s\n", SEP_LINE);
            while ( ! ws_empty(ws) )
                printf("%s\n", ws_pop(ws));
            printf("%s\n", SEP_LINE);
        }
    }
    
    ws_delete(ws);
    
    return 0;
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 4.182 из 5
Похожие ответы