C
chiiif2
Неправильно работает zamena...задание такое:составить из исходного текста новый,в который войдут строки с нечетным кол-вом символов,в этих строках слова минимальной длины заменить на слово пользователя
Все работает правильно,кроме сдвига в массиве
Все работает правильно,кроме сдвига в массиве
Код:
#include<iostream>
#include<conio.h>
#include<malloc.h>
using namespace std;
using std::cout;
using std::cin;
int dlin(char*);
bool proverka(char,char*);
int godOfF(char*,char*,int,int);
char* zamena(char*,char*,char*);
char* clone(char*);
char* vvod();
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*));
cout<<"Text\n";
j=0;
ks=0;
while(j<k){
text1[j]=vvod();
j++;
}
cout<<"Razdeliteli"<<"\n";
razd=vvod();
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=vvod();
cout<<"Isx text:\n";
for (j=0;j<k;j++){
cout<<text1[j]<<"\n";
free(text1[j]);
}
cout<<"Reformed text:\n";
for(j=0;j<ks;j++){
text2[j]=zamena(text2[j],slovo,razd);
cout<<text2[j]<<"\n";
free(text2[j]);
}
getch();
free(text1);
free(text2);
free(slovo);
free(razd);
return 0;
}
char* vvod(){
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 *zamena(char* str,char* word,char* pun){
int min=godOfF(str,pun,1,0);
int ind=0;
int lw=dlin(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-1;
while (str[i]!='\0'){
str[i]=str[i+1];
i++;
}
}
str=(char*)realloc(str,dlin(str)*sizeof(char));
}
if(lw>min){
str=(char*)realloc(str,(dlin(str)+lw-min)*sizeof(char));
for(j=0;j<(lw-min);j++){
i=dlin(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++;
}
}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((!proverka(str[i],pun)) && (str[i]!='\0')) i++;
min=dlin(str);
k=0;
indM=dlin(str)-1;
while(str[i] != '\0'){
while(proverka(str[i],pun)) i++;
if (str[i]=='\0') break;
k++;
lenW=0;
while(!proverka(str[i],pun)&& (str[i]!='\0')){
i++;
lenW++;
}
if (lenW<min){
min=lenW;
indM=i-min;
}
}
if(min==dlin(str)) min=0;
switch (w){
case 1: return min;
case 2: return indM;
case 3: return k;
} return 0;
}
int dlin(char* pun){
int k=0;
while(pun[k] != '\0') k++;
k++;
return k;
}
bool proverka(char c,char* pun){
int i;
bool j;
j=false;
for (i=0;i<(dlin(pun)-1);i++) if (c==pun[i]) j=true;
return j;
}
char* clone(char* is){
int i;
int a=dlin(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)&&(!proverka(str[i],pun))) return 0;
while((!proverka(str[i],pun)) && (str[i]!='\0')) i++;
while((proverka(str[i],pun))&&(str[i]!='\0')) i++;
if (str[i]=='\0') return -1;
return i;
}