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