#include <stdio.h>
#include <string.h>
//Максимальный размер считываемой из файла строки. Больше - обрежется
#define MAX_SIZE 255
//Читаем строчку из файла
void ReadString(FILE* infile, char* str) {
char ch='1';
int i;
for (i=0; 1; i++) {
fscanf(infile,"%c",&ch);
if (ch != '\n' && ! feof(infile) && i<MAX_SIZE )
str[i]=ch;
else
break;
}
str[i]='\0';
}
//С индексами
char* strtran(const char* string1, const char* string2,const char* string3)
{
int len1=strlen(string1);
int len2=strlen(string2);
int len3=strlen(string3);
int currlen=len1;
char* result=new char[currlen+1];
result[0]='\0';
for (int i=0, j=0; i<len1; i++, j++) {
if (string1[i] == string2[0]) {
int k;
//проходим и сравниваем с str2
for (k=0; string1[i+k]==string2[k] && k<len2 && string1[i+k]!='\0'; k++);
//Если совпадает
if (k == len2) {
currlen+=len3-len2;
char* temp=new char[currlen+1];
strcpy(temp,result);
strcat(temp,string3);
j+=len3-1;
i+=len2-1;
delete [] result;
result=temp;
continue;
}
}
result[j]=string1[i];
result[j+1]='\0';
//printf("'%s' %d %d\n",result,i,j);
}
return result;
}
// C указателями
char* strtranPointers(const char* string1, const char* string2,const char* string3)
{
int len1=strlen(string1);
int len2=strlen(string2);
int len3=strlen(string3);
int currlen=len1;
char* result=new char[currlen+1];
*result='\0';
for (int i=0, j=0; i<len1; i++, j++) {
if (*(string1+i) == *string2) {
int k;
//проходим и сравниваем с str2
for (k=0; *(string1+i+k)==*(string2+k) && k<len2 && *(string1+i+k)!='\0'; k++);
//Если совпадает
if (k == len2) {
currlen+=len3-len2;
char* temp=new char[currlen+1];
strcpy(temp,result);
strcat(temp,string3);
j+=len3-1;
i+=len2-1;
delete [] result;
result=temp;
continue;
}
}
*(result+j)=*(string1+i);
*(result+j+1)='\0';
}
return result;
}
int main() {
/* ********************************************* */
/* Часть 1: константная строка, вывод - на экран */
const char* mainStr="Тест провален! Конечно провален!";
const char* reprStr="провален";
const char* addStr="пройден";
char* str1=strtran(mainStr,reprStr,addStr);
char* str2=strtranPointers(mainStr,reprStr,addStr);
printf("Исходная строка: '%s'\nЗаменяем: '%s'\nНа: '%s'\n",mainStr,reprStr,addStr);
printf("Результат: '%s'\nС указателями: '%s'\n",str1,str2);
delete [] str1;
delete [] str2;
/* ********************************************** */
/* Часть 2: строки - массивы, ввод и вывод в файл */
FILE* infile=fopen("task1.in","r");
char arrMain[MAX_SIZE];
char arrRerp[MAX_SIZE];
char arrAdd[MAX_SIZE];
ReadString(infile,arrMain);
ReadString(infile,arrRerp);
ReadString(infile,arrAdd);
fclose(infile);
str1=strtran(arrMain,arrRerp,arrAdd);
str2=strtranPointers(arrMain,arrRerp,arrAdd);
FILE* outfile=fopen("task1.out","w");
fprintf(outfile,"Исходная строка: '%s'\nЗаменяем: '%s'\nНа: '%s'\n",arrMain,arrRerp,arrAdd);
fprintf(outfile,"Результат: '%s'\nС указателями: '%s'\n\n",str1,str2);
/* ************************************************ */
/* Часть 3: строки - указатели, ввод и вывод в файл */
infile=fopen("task1.in","r");
char* strMain=new char[MAX_SIZE];
char* strRerp=new char[MAX_SIZE];
char* strAdd=new char[MAX_SIZE];
ReadString(infile,strMain);
ReadString(infile,strRerp);
ReadString(infile,strAdd);
fclose(infile);
str1=strtran(strMain,strRerp,strAdd);
str2=strtranPointers(strMain,strRerp,strAdd);
fprintf(outfile,"Исходная строка: '%s'\nЗаменяем: '%s'\nНа: '%s'\n",strMain,strRerp,strAdd);
fprintf(outfile,"Результат: '%s'\nС указателями: '%s'",str1,str2);
fclose(outfile);
return 0;
}