Не корректно работает killer

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
Chiiif2
Сообщения: 4
Зарегистрирован: 17 май 2014, 13:26

Помогите пожалуйста,где-то в коде ошибка,а именно,связанная с работой функции killer

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

#include<iostream>
#include<conio.h>
#include<malloc.h>
using namespace std;

int len(char*);
bool isPun(char,char*);
int godOfF(char*,char*,int,int);
char* killer(char*,char*,char*);
char* clone(char*);
char* read();
int sword(char*,char*,int);

int main()
{
	int j,ks,k;
	char *razd,*slovo;
	char** text1;
    char** text2;
	printf("Vvedite kol_vo strok: " );
	cout<<"\n";
	cin>>k;
    text1=(char**)malloc(k*sizeof(char*));////var arrays
	text2=(char**)malloc(sizeof(char*));
	razd=(char*)malloc(sizeof(char));
    slovo=(char*)malloc(sizeof(char));
	cout<<"Davay epta"<<"\n";
	razd=read();
    cout<<"Text\n";
    j=0;
	ks=0;
	while(j<k){
               text1[j]=read();
               j++;
     }
    for (j=0;j<k;j++){
           if (godOfF(text1[j],razd,3,0)%2!=0){
                    ks++;
                    text2=(char**)realloc(text2,ks*sizeof(char*));
                    text2[ks-1]=clone(text1[j]); 
           }   
     }/////////end
    cout<<"slovo"<<"\n";
	slovo=read();
	for (j=0;j<k;j++) cout<<text1[j]<<"\n";
	cout<<"Reformed text:\n";
	for(j=0;j<ks;j++){
		text2[j]=killer(text2[j],slovo,razd);
		cout<<text2[j]<<"\n";
	}

	getch();
       for (j=0;j<k;j++) free(text1[j]);
       free(text1);
       for (j=0;j<ks;j++) free(text2[j]);
       free(text2);
       free(razd); 
	return 0;
}
char* read(){
	char *str=(char*)malloc(sizeof(char));
    int i=0;
    while((str[i]=_getche())!='\r'){                                          
           i++;
           str=(char*)realloc(str,(i+1)*sizeof(char));
    }     
    str[i]='\0'; 
    cout<<"\n";
	return str;
}
char *killer(char* str,char* word,char* pun){
    int min=godOfF(str,pun,1,0);
	int ind=0;
	int lw=len(word)-1;
	int i=0;
	int j=0;
	do{
		ind=godOfF(str,pun,2,ind);
		if(lw<min){
			for(j=0;j<(min-lw);j++){
				i=ind+min;
				while (str[i]!='\0'){
					str[i]=str[i+1];
					i++;
				}	
			}
			str=(char*)realloc(str,len(str)*sizeof(char));
        }
		if(lw>min){
            str=(char*)realloc(str,(len(str)+lw-min)*sizeof(char));
			for(j=0;j<(lw-min);j++){
				i=len(str);
				
				while (i>(ind+min)){
					str[i+1]=str[i];
					i--;
				}	
			}
        }
		lw=0;
		i=ind;
		while(word[lw]!='\0'){
			str[i]=word[lw];
			i++;
			lw++;
		}
      cout<<ind<<"\n";
	}while(godOfF(str,pun,1,ind)==min);
	return str;
} 
int godOfF(char* str,char* pun,int w,int index){
     int i,lenW,indM,k,min;
     i=index;
     if (index!=0) while((!isPun(str[i],pun)) && (str[i]!='\0')) i++;
     min=0;
     k=0;
     indM=len(str)-1;
         while(str[i] != '\0'){			
            while(isPun(str[i],pun)) i++;          
            if (str[i]=='\0') break;
            k++;
            lenW=0;
            while(!isPun(str[i],pun)&& (str[i]!='\0')){
               i++;
               lenW++;
               
            }
            if ((lenW<min)&(min>0)){ 
               min=lenW;
               indM=i-min;
               }                                         
     }
     switch (w){
            case 1: return min;    
            case 2: return indM; 
            case 3: return k; 
     } return 0 ;   
}
int len(char* pun){
     int k=0;     
     while(pun[k] != '\0') k++;
     k++; 
     return k;
}
bool isPun(char c,char* pun){
     int i;
     bool j;
     j=false;
      for (i=0;i<(len(pun)-1);i++) if (c==pun[i]) j=true;
      return j;
}
char* clone(char* is){
     int i; 
     int a=len(is);
	 char* str=(char*)malloc(a*sizeof(char));
     for (i=0;i<a;i++) str[i]=is[i];
     return str;
}
int sword(char* str,char* pun,int ind){
	int i=ind;
	if ((ind==0)&&(!isPun(str[i],pun))) return 0;

	while((!isPun(str[i],pun)) && (str[i]!='\0')) i++;
	while((isPun(str[i],pun))&&(str[i]!='\0')) i++;
	if (str[i]=='\0') return -1;
	return i;
}
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Кода достаточно много и на то, чтобы в нём разобраться, нужно время. А что, отладка не помогает идентифицировать ошибку?
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Chiiif2
Сообщения: 4
Зарегистрирован: 17 май 2014, 13:26

Romeo писал(а):Кода достаточно много и на то, чтобы в нём разобраться нужно время. А что, отладка не помогает идентифицировать ошибку?

Отладка показывает что все правильно,а в общем-то так и есть,просто при сдвиге(ф-ия киллер) он заменяет разделители на другие значения
Ответить