• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

Неправильно Работает Zamena

  • Автор темы chiiif2
  • Дата начала
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;
}
 

Вложения

  • main5.cpp
    3,8 КБ · Просмотры: 187
R

rrrFer

Очень много кода. Выдели проблемный фрагмент в отдельную программу и приведи пример исходных данных, который показывает что этот фрагмент работает неверно.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!