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

  1. Включаются необходимые заголовочные файлы:
    • 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)
  2. Создаются и инициализируются переменные:
    • char str[256]={'\0'} - строка для ввода, все символы в которой являются нулевыми (пустая строка)
    • char fin[256]={0} - строка для хранения результата, все символы в которой также являются нулевыми (пустая строка)
    • char *cur = NULL, *prev = NULL; - две указатели на строку, которые будут использоваться в цикле
    • int equals = 0, repeat = 0; - две переменные для подсчета одинаковых слов и их повторений
  3. Выполняется ввод строки от пользователя:
    • printf(input_string: ); - выводится приглашение для ввода строки
    • gets(str); - функция, считывающая строку до нажатия клавиши Enter (или до ошибки) и сохраняющая ее в переменной str
  4. Начинается обработка строки:
    • cur = strtok(str, ); - функция, разделяющая строку на слова и возвращающая первый элемент (то есть само слово и NULL-указатель для следующего слова)
    • prev = cur; - присваиваем предыдущему слову значение текущего слова
  5. Происходит сравнение и добавление слов в результирующую строку:
    • while (cur != NULL) - цикл выполняется, пока есть слова в строке
    • cur = strtok(NULL, ); - функция, возвращающая следующий элемент (слово) в строке
    • equals = (cur && (strcmp(prev, cur) == 0)); - сравниваем текущее слово с предыдущим, и если они равны, то увеличиваем счетчик повторений
    • if(!equals && !repeat) - если текущее слово не равно предыдущему и не было повторений, то добавляем текущее слово в результирующую строку
    • strcat(fin, prev); - функция, добавляющая строку к другой строке
    • strcat(fin, ); - добавляем пробел после слова
    • repeat = equals; - обновляем счетчик повторений
    • prev = cur; - обновляем предыдущее слово
  6. Выводится результирующая строка:
    • printf(finish_string: %s\n, fin); - выводится результирующая строка
  7. Выполняется завершение программы:
    • getchar(); - считывание символа из потока ввода (нажатие клавиши Enter)
    • return 0; - завершение работы программы (код 0)

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 3.333 из 5
Похожие ответы