Удалить одинаковые слова предложения, идущие подряд - 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)