Строки_в_С++

Ответить
pymba
Сообщения: 23
Зарегистрирован: 07 дек 2008, 11:25

07 апр 2009, 16:39

помогите_решить,plz…
Дана_подстрока_из_нескольких_символов._Удалить_из строки_все_вхождения_заданной_подстроки_и_подсчита ть_количество_удалений.
pymba
Сообщения: 23
Зарегистрирован: 07 дек 2008, 11:25

10 май 2009, 12:46

посмотрите,plz. помогите исправить

Код: Выделить всё

#include <stdio.h>
#include <conio.h>
#include <iostream.h>
#include <string.h>

char *strstr_rem(char *string,char *substring)
	{
	int i,j,k,l=0;
	for(i=0;string [i]&&(l==0);i++)
	for(j=i,k=0;string[j]==substring[k];j++,k++)
	if(!substring[k+1])
	l=i;
	if(l!=0)
		{
		for(k=0;substring[k];k++)
		for(j=l,i=l+k;string[i];j++,i++)
		string[j]=string[i];
		string[i]=NULL;
		}
	cout<<string;
	}
char *strstr_cnt(const char *string, const char *substring)
	{
	int i,j,k,c=0;
	for(i=0;string[i];i++)
	for(j=i,k=0;string[j]==substring[k];j++,k++)
	if(!substring [k+1])
	c++;
	cout<<c;
	}
void main()
	{
	clrscr();
	char string[20],substring[20];
	cout<<"Vvedite stroky"<<endl;
	cin.getline(string,20);
	cout<<"Vvedite podstroky"<<endl;
	cin.getline(substring,20);
	strstr_rem(string,substring);
        cout<<endl;
	strstr_cnt(string,substring);
	getch();
	}
Albor
Сообщения: 482
Зарегистрирован: 06 сен 2004, 13:34
Откуда: Днепропетровск

10 май 2009, 14:19

Код: Выделить всё

int strstr_cnt(const char * pTarget, const char * pFind)
{
    int cnt(0);
    unsigned len(strlen(pFind));
    char *p=strstr(pTarget,pFind);
    while(p)
    {
        ++cnt;
        [B]char * pch=p+len;
        while(*pch!=0) *p++=*pch++;//удаление подстроки
        *p=0;[/B]
        p=strstr(pTarget,pFind);
    }
    return cnt;
}
Функция модифицирует исходный массив и возвращает количество удалений подстрок.
pymba
Сообщения: 23
Зарегистрирован: 07 дек 2008, 11:25

11 май 2009, 12:57

а как удалить подстроку?
Albor
Сообщения: 482
Зарегистрирован: 06 сен 2004, 13:34
Откуда: Днепропетровск

12 май 2009, 07:25

pymba писал(а):а как удалить подстроку?
После отработки моей функции все вхождения подстроки будут удалены:
Функция модифицирует исходный массив
то есть массив, переданный в первом параметре.
PTarget-это указатель на массив в котором ищем и удаляем, pFind - указатель на подстроку которую ищем. Используется примерно так:

Код: Выделить всё

void main(void)
{
    char source[100]="asdsdffdsasdf";
    char find[100]="asd";
    
    cout<<source<<" "<<strstr_cnt(source,find)<<endl;
} 
Я предполагал, что вы разберётесь. В листинге функции выделил строки, которые удаляют подстроку, копируя часть исходного массива от конца найденной подстроки в начало найденного. Если есть необходимость, то выделите эти строки в отдельную функцию.
Ответить