Задать вопрос
@mrFrip
Преодолеваю прокрастинацию

Поиск одинаковых символов в строке и их замена. Какие функции лучше использовать?

Си (не плюсы!)

нужно использовать библиотеку string.h
Использовать можно только массив со строкой, нельзя использовать доп.массив для хранения новой строки
ввод происходит через gets()

Имеется строка, в которой может встретиться несколько одинаковых символов подряд (точка). Нужно заменить их на 1 такой символ (....... -> .).

Подскажите, какие лучше функции использовать для этого?
Имеет ли смысл использовать strtok и strspn
  • Вопрос задан
  • 6423 просмотра
Подписаться 2 Простой 3 комментария
Пригласить эксперта
Ответы на вопрос 3
@MiiNiPaa
Если есть желание использовать библиотечные функции, то имеет смысл использовать strchr в цикле, чтобы найти следующую группу точек. Дальше в принципе можно использовать strspn, чтобы найти длину сегмента точек и пропустить его, но я бы сделал это просто проверкой в цикле.
Ответ написан
Комментировать
@res2001
Developer, ex-admin
strcpy
Искать и считать число повторов лучше вручную, т.к. конкретно такой функции нет.
Ответ написан
Комментировать
dio4
@dio4
team leader, system engineer, master of sports
Код корявый (делал на коленке и бегом), но почти все, как задано в условии. Только один массив для строки и есть проверки на старте программы (на единичность символа, на его отсутствие и тд - смотрите). Меняет и повторяющиеся участки тоже (без ограничений - только на размер buff). Код вроде работает как надо. Пользуйтесь.
/* ваши комменты */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define SIZE 50
char buff[SIZE] = {0};

int main(int argc, char * argv[]){
	int i, j, num1, num2;
	char c = '.'; // искомый символ
	char * str_ptr1;
	char * str_ptr2;
	puts("введите произвольную строку");
	gets(buff);
	str_ptr1 = strchr(buff, c);
	str_ptr2 = strrchr(buff, c);
	
	if (str_ptr1 == 0){ 
		puts("искомого символа нет в строке");
		exit(EXIT_FAILURE);
	}
	else if (str_ptr2 == 0 || str_ptr2 == str_ptr1){
		fprintf(stdout, "%s", "Искомый символ единичен в строке");
		exit(EXIT_FAILURE);
	}
	size_t len = strlen(buff);
	i = 0;
	while(buff[i] != '\0'){
		if(buff[i] == c && buff[i+1] == c){
			num1 = i + 1;
			while(buff[i+1] == c){
				++i;
				num2 = i;
			}
			
			for(j = 0; j <= (len - num2 + 1); ++j){
			buff[num1 + j] = buff[num2 + 1 + j];
			}
		}
		++i;
	}
	puts("Итоговая строка имеет вид: ");
	puts(buff);
	exit(EXIT_SUCCESS);
}
/* в консоли:
введите произвольную строку
...abc...de
Итоговая строка имеет вид: 
.abc.de

введите произвольную строку
   ngt,,,
искомого символа нет в строке

*/
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы