I wanted to create a function which accepts a string & a delimiter. Finds the small blocks of string separated by the delimiters and replace the block based on some logic.
I have created a simple example below to represent the logic I am trying to write. I also tried to make sure that I handle all cases where the user can by-mistakely pass a lone delimiter.
Eg. Usage:
findDelimitedBlocks(inString,"@@#")
inString: @@#animal@@# is a great hunter, he likes @@#food@@#.
outString: LION is a great hunter, he likes deer.....
API:
void main()
{
char queryInStringg[10000] = "@@#animal@@# is a great hunter, he likes @@#food@@#....";
printf("\nString Before [%s]",queryInStringg);fflush(stdout);
findDelimitedBlocks(queryInStringg,"@@#");
printf("\nString After [%s]",queryInStringg);fflush(stdout);
return 0;
}
int findDelimitedBlocks(char *inString, char *delimiter)
{
char string_Variable[5000] ;
char outString[strlen(inString)+5000] ;
long string_Variable_Index = 0 ;
long inStringIndex = 0 ;
long outStringIndex = 0 ;
int logical_Variable = 0 ;
long i_loop_counter = 0 ;
long j_loop_counter = 0 ;
long delimiter_Size = 0 ;
memset(string_Variable, 0x00, sizeof(string_Variable));
memset(outString, 0x00, sizeof(outString));
delimiter_Size = strlen(delimiter);
while(1)
{
if(inString[inStringIndex] == 0x00)
{
outString[outStringIndex] = 0x00;
break;
}
if(inString[inStringIndex] == delimiter[0])
{
for(i_loop_counter = 1 ; ; i_loop_counter++)
{
if(inString[inStringIndex+i_loop_counter] == 0x00)
{
logical_Variable = 0;
break;
}
if(delimiter[i_loop_counter] == 0x00)
{
logical_Variable = 1;
break;
}
if(inString[inStringIndex+i_loop_counter] != delimiter[i_loop_counter])
{
logical_Variable = 0;
break;
}
}
if(logical_Variable == 1)
{
memset(string_Variable, 0x00, sizeof(string_Variable));
string_Variable_Index = 0;
logical_Variable = 0;
for(j_loop_counter = 0 ; ; j_loop_counter++)
{
if(inString[inStringIndex+delimiter_Size+j_loop_counter] == 0x00)
{
outString[outStringIndex++] = inString[inStringIndex];
break;
}
if(inString[inStringIndex+delimiter_Size+j_loop_counter] == delimiter[0])
{
for(i_loop_counter = 1 ; ; i_loop_counter++)
{
if(delimiter[i_loop_counter] == 0x00)
{
logical_Variable = 1;
break;
}
if(inString[inStringIndex+delimiter_Size+j_loop_counter+i_loop_counter] != delimiter[i_loop_counter]
|| inString[inStringIndex+delimiter_Size+j_loop_counter+i_loop_counter] == 0x00)
{
logical_Variable = 0;
break;
}
}
if(logical_Variable == 1)
{
string_Variable[string_Variable_Index] = 0x00;
/*After Finding I will incorporate the rest of the replace logic*/
if(strcmp(string_Variable,"animal") == 0)
{
memset(string_Variable, 0x00, strlen(string_Variable));
sprintf(string_Variable,"LION");
}
else if(strcmp(string_Variable,"food") == 0)
{
memset(string_Variable, 0x00, strlen(string_Variable));
sprintf(string_Variable,"deer");
}
else
{
memset(string_Variable, 0x00, strlen(string_Variable));
sprintf(string_Variable,"IREPLACE");
}
strcat(outString,string_Variable);
outStringIndex += strlen(string_Variable);
inStringIndex += string_Variable_Index+delimiter_Size+delimiter_Size - 1;
break;
}
else
{
string_Variable[string_Variable_Index++] = inString[inStringIndex+delimiter_Size+j_loop_counter];
}
}
else
{
string_Variable[string_Variable_Index++] = inString[inStringIndex+delimiter_Size+j_loop_counter];
}
}
}
else
{
outString[outStringIndex++] = inString[inStringIndex];
}
}
else
{
outString[outStringIndex++] = inString[inStringIndex] ;
}
inStringIndex ++ ;
}
memset(inString, 0x00, strlen(inString));
strcpy(inString,outString);
return(0);
}
I want to know
- If there are any more exceptions that I might have missed or there is any bug in the code?
- Is there a better/more efficient way to write the function?