Дано предложение. Нужно напечатать все его различные слова. Предварительно удалить все знаки препинания - C (СИ)
Формулировка задачи:
Возможно ли это сделать на базовом уровне, понятном для понимания школьнику
Решение задачи: «Дано предложение. Нужно напечатать все его различные слова. Предварительно удалить все знаки препинания»
textual
Листинг программы
#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct SETNODE { const char * wrd; struct SETNODE * next; } setnode_t, * set_t; setnode_t * setnode_new(const char * w) { setnode_t * n = malloc(sizeof(setnode_t)); if ( ! n ) return NULL; n->wrd = w; n->next = NULL; return n; } void setnode_free(setnode_t * n) { free(n); } int set_append(set_t * s, const char * w) { while ( *s && strcmp((*s)->wrd, w) ) s = &((*s)->next); if ( ! *s ) { setnode_t * n = setnode_new(w); if ( ! n ) return -1; *s = n; } return 0; } void set_dump(set_t s) { while ( s ) { printf("%s\n", s->wrd); s = s->next; } } void set_free(set_t * s) { if ( *s ) { set_free(&((*s)->next)); setnode_free(*s); *s = NULL; } } #define DELIM " ,.!?-\t\n" int main(void) { char buf[BUFSIZ]; while ( printf("String: ") && fgets(buf, BUFSIZ, stdin) && *buf != '\n' ) { set_t set = NULL; char * ptr; for ( ptr = strtok(buf, DELIM); ptr; ptr = strtok(NULL, DELIM) ) { if ( set_append(&set, ptr) ) { fprintf(stderr, "Memory error!\n"); exit(1); } } if ( ! set ) printf("Empty string.\n"); else { printf("Unique words:\n"); set_dump(set); printf("\n"); set_free(&set); } } return 0; }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д