Удалить одинаковые слова предложения, идущие подряд - C (СИ) (75845)
Формулировка задачи:
Здравствуйте! Задание такое: удалить одинаковые слова предложения, идущие подряд.
Набросал код, но после его выполнения одно слово, из нескольких одинаковых остаётся.
Помогите доделать, что б удаляло все одинаковые идущие подряд слова.
Например: qqq qqq qqq etrt fgj ew ew qas w w w
Что бы стало: etrt fgj qas, а не: etrt fgj ewqas w
#include <stdio.h> #include <stdlib.h> int main() { char str[256]={'\0'}, fin[256]={0}; char *cur = NULL, *prev = NULL; clrscr(); printf("input_string: "); gets(str); cur = strtok(str," "); prev = cur; while (cur != NULL) { cur = strtok(NULL," "); if(strcmp(prev, cur) != NULL) { strcat(fin, cur); strcat(fin, " "); } prev = cur; } printf("finish_string: "); puts(fin); getchar(); return 0; }
Решение задачи: «Удалить одинаковые слова предложения, идущие подряд»
textual
Листинг программы
#include <stdio.h> #include <string.h> #include <stdlib.h> int main() { char str[256]={'\0'}, fin[256]={0}; char *cur = NULL, *prev = NULL; int equals, repeat = 0; //clrscr(); printf("input_string: "); gets(str); cur = strtok(str," "); prev = cur; while (cur != NULL) { cur = strtok(NULL," "); equals = (cur && (strcmp(prev, cur) == 0)); if(!equals && !repeat) { strcat(fin, prev); strcat(fin, " "); } repeat = equals; prev = cur; } printf("finish_string: %s\n", fin); getchar(); return 0; }
Объяснение кода листинга программы
В этом коде на языке C происходит следующее:
- Включаются необходимые заголовочные файлы:
stdio.h
для работы с консолью (FILE, printf, scanf, fprintf, fscanf, fflush, puts, getchar, printf_s, scanf_s)string.h
для работы со строками (char*, strlen, strcpy, strncpy, strcmp, strcat, strncat)stdlib.h
для работы с числами (abs, atoi, atof, atoi, atof) и другими функциями (system, rand, srand)
- Создаются и инициализируются переменные:
char str[256]={'\0'}
- строка для ввода, все символы в которой являются нулевыми (пустая строка)char fin[256]={0}
- строка для хранения результата, все символы в которой также являются нулевыми (пустая строка)char *cur = NULL, *prev = NULL;
- две указатели на строку, которые будут использоваться в циклеint equals = 0, repeat = 0;
- две переменные для подсчета одинаковых слов и их повторений
- Выполняется ввод строки от пользователя:
printf(
input_string:);
- выводится приглашение для ввода строкиgets(str);
- функция, считывающая строку до нажатия клавиши Enter (или до ошибки) и сохраняющая ее в переменнойstr
- Начинается обработка строки:
cur = strtok(str,
);
- функция, разделяющая строку на слова и возвращающая первый элемент (то есть само слово и NULL-указатель для следующего слова)prev = cur;
- присваиваем предыдущему слову значение текущего слова
- Происходит сравнение и добавление слов в результирующую строку:
while (cur != NULL)
- цикл выполняется, пока есть слова в строкеcur = strtok(NULL,
);
- функция, возвращающая следующий элемент (слово) в строкеequals = (cur && (strcmp(prev, cur) == 0));
- сравниваем текущее слово с предыдущим, и если они равны, то увеличиваем счетчик повторенийif(!equals && !repeat)
- если текущее слово не равно предыдущему и не было повторений, то добавляем текущее слово в результирующую строкуstrcat(fin, prev);
- функция, добавляющая строку к другой строкеstrcat(fin,
);
- добавляем пробел после словаrepeat = equals;
- обновляем счетчик повторенийprev = cur;
- обновляем предыдущее слово
- Выводится результирующая строка:
printf(
finish_string: %s\n, fin);
- выводится результирующая строка
- Выполняется завершение программы:
getchar();
- считывание символа из потока ввода (нажатие клавиши Enter)return 0;
- завершение работы программы (код 0)
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д