Дано предложение. Нужно напечатать все его различные слова. Предварительно удалить все знаки препинания - 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;
}