Распечатать все самые длинные слова предложения - 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; }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д