Распечатать все самые длинные слова предложения - 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;
}