L
Linko
Здравствуйте, уважаемые!
Пытаюсь написать программу для замены символов в строке, но не получается, появилась плавающая ошибка. Вот там где я отметил стрелочкой, после этого происходит добавление левых символов в строку, не всегда причем, понять в чем проблема не могу. А когда происходит вызов замены для последней пары из структуры - так там вообще сразу получается мусор.
Проблемы возникают при замене с 'r' на 'р', текст превращается в :
Пытаюсь написать программу для замены символов в строке, но не получается, появилась плавающая ошибка. Вот там где я отметил стрелочкой, после этого происходит добавление левых символов в строку, не всегда причем, понять в чем проблема не могу. А когда происходит вызов замены для последней пары из структуры - так там вообще сразу получается мусор.
Проблемы возникают при замене с 'r' на 'р', текст превращается в :
Код:
был: Thиs иs a '#URL#' strиng "#ID#" HA-HA-HA, #ID# for testиng #IDCODE#---
стал: Thиs иs a '#URL#' stЪЪЪЪриng "#ID#" HA-HA-HA, #ID# for testиng #IDCODE#---
Код:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <memory.h>
typedef struct
{
char from[32];
char to[64];
} tagStruct;
char * tagReplacer(char *src, tagStruct * tagS, int count)
{
bool replaced=true;
char *tmp=NULL;
char *res=NULL;
char *pch=NULL;
tmp=(char*) malloc(sizeof(char)+1);
res=(char*) malloc(sizeof(char)+1);
res=(char*)realloc(res,((strlen(src))*sizeof(char*)));
strcpy (res,src);
for(int i=0;i<count;i++) {
while (replaced) {
int lenres=strlen(res);
if(pch = strstr (res,tagS[i].from)) {
replaced=true;
tmp=(char*)realloc(tmp, (lenres-strlen(pch)+1)*sizeof(char));
strncpy(tmp,res,lenres-strlen(pch));
tmp=(char*)realloc(tmp, (strlen(tmp)+strlen(tagS[i].to)+1)*sizeof(char));
strncat(tmp,tagS[i].to,strlen(tagS[i].to));
if((strlen(tmp))<(lenres+strlen(tagS[i].to)-strlen(tagS[i].from))){
-->>> tmp=(char*)realloc(tmp, (lenres+strlen(tagS[i].to)-strlen(tagS[i].from)-1)*sizeof(char));
for(int z=(strlen(res)-strlen(pch)+strlen(tagS[i].to));z<((strlen(res)));z++){
tmp[strlen(tmp)]=res[z];
}
}
}
else {
replaced=false;
}
if(replaced) {
res=NULL;
res=(char*)realloc(res,(strlen(tmp)+1));
strncpy (res,tmp,strlen(tmp));
tmp=NULL;
pch=NULL;
}
}
replaced=true;
}
return res;
}
int main ()
{
tagStruct *tagStr=NULL;
tagStr=(tagStruct*) malloc(sizeof(tagStruct));
strcpy(tagStr[0].from,"i");
strcpy(tagStr[0].to,"и");
tagStr=(tagStruct*)realloc(tagStr, (sizeof(tagStruct))*2);
strcpy(tagStr[1].from,"r");
strcpy(tagStr[1].to,"р");
tagStr=(tagStruct*)realloc(tagStr, (sizeof(tagStruct))*3);
strcpy(tagStr[2].from,"t");
strcpy(tagStr[2].to,"т");
tagStr=(tagStruct*)realloc(tagStr, (sizeof(tagStruct))*4);
strcpy(tagStr[3].from,"Th");
strcpy(tagStr[3].to,"В");
const char *foo=tagReplacer("This is a '#URL#' string \"#ID#\" HA-HA-HA, #ID# for testing #IDCODE#---",tagStr,4);
printf("%s\n",foo);
}