Удалить одинаковые слова предложения, идущие подряд - C (СИ) (150116)
Формулировка задачи:
Удалить одинаковые слова предложения, идущие подряд.
с коментариями пожалуйста
Решение задачи: «Удалить одинаковые слова предложения, идущие подряд»
textual
Листинг программы
#include <stdio.h> #include <ctype.h> static char* word_next(char* s, int* n); static int str_cmp(const char* s1, int n1, const char* s2, int n2); void delword_rep2(char* s); int main(void){ char s[] = "APL APL APL go go go go go. go XYZ? XYZ XYZ!XYZ"; puts(s); delword_rep2(s); puts(s); return 0; } // да тут всё просто, ибо затираем и всё... void delword_rep2(char* s){ int n1, n2; char* w1, *w2, *o, *p; for(p = s; *s; *s = *p){ if(isalnum(*p)){ w1 = word_next(p, &n1); // получаем слово if(w1 != NULL){ w2 = w1 + n1; //далее в цикле сравниваем со следующими словами while((o = word_next(w2, &n2)) != NULL){ if(str_cmp(o, n2, w1, n1)) w2 = o + n2; else break; } if(w2 != w1 + n1){ p = w2; continue; } } w1 += n1; while(p != w1) *s++ = *p++; continue; } ++s; ++p; } } //получение слова static char* word_next(char* s, int* n){ char* p; while(*s && !isalnum(*s)){ if(*s == '.' || *s == '!' || *s == '?') return NULL; ++s; } p = s; *n = 0; while(isalnum(*p)) ++p; *n = (int)(p - s); return s; } //сравнение 2-ух слов static int str_cmp(const char* s1, int n1, const char* s2, int n2){ if(n1 != n2) return 0; while((n1 > 0) && (*s1 == *s2)){ ++s1; ++s2; --n1; } return (!n1); }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д