patterncMinor
Optimizing string replacement program that uses recursion
Viewed 0 times
recursionprogramusesoptimizingthatstringreplacement
Problem
I have the following string replacement program for a string of size 256:
I am replacing the string
"\'"
with the string
'
Please suggest any modifications if needed or any mistake I have done.
I am replacing the string
"\'"
with the string
'
Please suggest any modifications if needed or any mistake I have done.
#include
#include
int replace_str(char *SrcStr, char *SubStr, char *RepStr, char *FinalStr )
{
static char buffer[256]="";
char *TempStr= NULL;
char *Tmp2 = malloc(250);
memset(Tmp2,0,256);
int ret = 0;
TempStr = strstr(SrcStr, SubStr);
if ( TempStr )
{
memcpy(Tmp2,TempStr,strlen(TempStr));
strncpy(buffer, SrcStr, TempStr-SrcStr);
buffer[TempStr-SrcStr] = '\0';
sprintf(buffer+(TempStr-SrcStr), "%s%s", RepStr, Tmp2+strlen(SubStr));
puts(buffer);
free(Tmp2);
ret = replace_str(buffer, SubStr, RepStr, FinalStr);
}
else
{
memcpy(FinalStr, buffer , strlen(buffer));
}
return ret;
}
int main(void)
{
char *str1 = malloc(256);
memset(str1, 0 ,256);
memcpy(str1, "pra\'dipta\'kumar\'rout",strlen("pra\'dipta\'kumar\'rout"));
char str2[10] = "'";
char str3[3] = "\'" ;
char buff[256] ={0};
replace_str(str1, str3, str2,buff);
puts(buff);
return 0;
}Solution
- Many strange numbers. Why is
Tmp2only 250 long?
- Why is
bufferstatic?
- Why is
Tmp2notfreed in the else branch? Most likely themalloc()should also only happen in the then branch.
- The
replace_strfunction should take a length argument forFinalStr, now this might cause a buffer overflow.
- Your naming is very strange: Both
TmpStrandTmp2are temporary strings, but they are named quite different. Better give them proper names.
if (TmpStr)uses implicit boolean conversion of pointers. That's bad practice.
- Your variable naming convention is inconsequent, some are UpperCamelCase, some are lower case.
- Why is there a call to
puts? The function should work on a string, not print onstdout.
- Now that I think about it: Using fixed size
mallocis generally stupid.
Either make that dependent on the actual needs or just use
char[256].- Also you might want to use
callocinstead ofmalloc.
- Potential buffer overflow in
memcpy(Tmp2,TempStr,strlen(TempStr));
- Potential buffer overflow in
sprintf(buffer+(TempStr-SrcStr), "%s%s", RepStr, Tmp2+strlen(SubStr));
- Also why are you using
strncpyandsprintffor the same purpose (string concatenation)? You might want to look atstrncat.
- Unnecessary memory eating: The temporary strings are not needed for the recursion, better free before.
- Similar for buffer.
Context
StackExchange Code Review Q#54052, answer score: 4
Revisions (0)
No revisions yet.