Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.11.2022, 14:51   #1
Daniil Orlov
Новичок
Джуниор
 
Регистрация: 18.09.2022
Сообщений: 3
По умолчанию В каждом слове строки удалить все последующие вхождения первого символа этого слова - C (Си)

Словом считать любую последовательность, содержащую только русские и латинские буквы. Разделители между словами и их количество может быть любым.
В каждом слове строки удалить все последующие вхождения первого символа этого слова.

Буду благодарен тем, кто поможет.

Получилось только написать код, который берёт самый первый символ строки и во всех последующих словах удаляет его.

Код:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <clocale>
#include <string.h>
 
void Delete_Symbol(int len, char* str, char* result) {
    printf("Введите текст (на английском):\n"); fgets(str, len, stdin);
    char symbol = str[0];
    result[0] = symbol;
    for (int i = 0, j = 1; i < len; i++) {
        if (str[i] != symbol) {
            result[j++] = str[i];
        }
    }
    printf("Готовый текст: %s", result);
}
 
int main() {
    setlocale(LC_ALL, "rus");
    const int len = 100;
    char str[len];
    char result[len];
    Delete_Symbol(len, str, result);
}
Daniil Orlov вне форума Ответить с цитированием
Старый 14.11.2022, 04:23   #2
Пётр Седов
Форумчанин
 
Регистрация: 26.10.2022
Сообщений: 119
По умолчанию

Daniil Orlov, можно так:
Код:
#include <stdio.h>

typedef int bool_t; /* в новых компиляторах можно #include <stdbool.h> и использовать тип bool */

bool_t is_letter(char elem) {
  unsigned char u_elem;

  if (('a' <= elem) && (elem <= 'z')) {return 1;}
  if (('A' <= elem) && (elem <= 'Z')) {return 1;}

  /* считаем, что русские буквы в кодировке code page 1251 */
  u_elem = (unsigned char)elem; /* надо, потому что в некоторых компиляторах, тип char -- знаковый (signed, -128 .. 127) */
  if (((224 <= u_elem) && (u_elem <= 255)) || (u_elem == 184)) {return 1;} /* а .. я, ё */
  if (((192 <= u_elem) && (u_elem <= 223)) || (u_elem == 168)) {return 1;} /* А .. Я, Ё */

  return 0; /* false */
}

void remove_first_letters(char* text) {
  int read_pos = 0;
  int write_pos = 0;
  char elem;
  char word_first_elem = '\0'; /* нет информации про слово */

  for (;;) {
    elem = text[read_pos++]; /* читаем элемент */
    if (is_letter(elem)) {
      if (elem != word_first_elem) {
        text[write_pos++] = elem; /* пишем элемент */
      }
      if (word_first_elem == '\0') {
        /* началось новое слово */
        word_first_elem = elem;
      }
    } else {
      text[write_pos++] = elem; /* пишем элемент */
      if (elem == '\0') {break;} /* если дошли до конца текста */
      word_first_elem = '\0'; /* забываем про слово */
    }
  }
}

int main() {
  /* копируем строковый литерал в локальный массив на stack-е */
  char s[] = "very successful racer, lately retired";
  remove_first_letters(s);
  printf("%s\n", s);
  return 0;
}
Вывод на консоль:
Код:
very succeful race, latey retied
У меня вся работа делается в одном массиве. Но легко переделать, чтобы было как у вас: читаем элементы из одного массива, пишем в другой массив.

Код написал для случая, когда русские буквы хранятся в кодировке code page 1251. Потому что с ней всё просто: каждая русская буква кодируется одним элементом (байтом). Например, буква «я» кодируется элементом 255. А вот с кодировкой UTF-8 (которую и надо использовать в современных программах) было бы сложнее, потому что в ней каждая русская буква кодируется двумя элементами (байтами). Например, буква «я» кодируется элементами 209, 143.
Пётр Седов вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Строка: Удалить все символы в строке, которые стоят после первого вхождения символа ‘*’, но ко второму его вхождения VLADOS2001 Помощь студентам 0 26.09.2019 17:22
Удалить последнюю букву в каждом слове. XakProg Помощь студентам 2 25.11.2018 08:36
Удаление первого и последнего символа в каждом слове на Pascal С_Екатерина Помощь студентам 2 07.10.2018 10:41
Удаление последнего символа в каждом слове - C++ Jed1kiss Помощь студентам 3 02.12.2016 13:11
Поиск в строке первого вхождения символа на СИ dannae Помощь студентам 3 26.11.2013 15:05