Inanzitutto nel MAIN CI VA IL RETURN [value] !
Hai complicato troppo la funzione remove comment,troppi cicli nidificati che fanno esattamente la stessa cosa del ciclo principale,entri cosi in una ridondanza ciclica e avvengono cose brutte.
Se infatti il codice terminasse con:
...code
\\Commento finale
Il programma andrebbe in crash perchè tu esci con "\n" e non ti aspetti la fine della stringa.
Bisogna quindi impostare il ciclo iniziale in modo che copi solo un determinato tipo di cose,il tutto si fa con dei semplici if.
Ti posto un esempio:
void removecomment(char from[],char to[])
{
const int ISCODE = 0;
const int ISINLINECOMMENT = 1;
const int ISMULTILINECOMMENT = 2;
int i,k;
int enablecomment;
for(k=0,i=0,enablecomment=ISCODE; from[i]!='\0';i++)
{
if (enablecomment == ISCODE)
{
if (from[i]=='/')
{
if(from[i+1]=='/')
{
i++;
enablecomment=ISINLINECOMMENT;
}
else if(from[i+1]=='*')
{
i++;
enablecomment=ISMULTILINECOMMENT;
}
else
{
to[k++]=from[i];
}
}
else
{
to[k++]=from[i];
}
}
else if (enablecomment == ISINLINECOMMENT)
{
if (from[i] == '\n') enablecomment = ISCODE;
}
else if (enablecomment == ISMULTILINECOMMENT)
{
if (from[i] == '*' && from[i+1] == '/')
{
++i;
enablecomment=ISCODE;
}
}
}
to[k]='\0';
}
int main(void)
{
char ccode[]="// INCLUDE LIB\n"
"#include <stdio.h>\n"
"#include <stdlib.h>\n"
"// DEFINE\n"
"/* \n"
"#define MIO 1\n"
"#define TUO 2\n"
"*/\n"
"int main() \n"
"{\n"
"\tprintf(\"in all function main use RETURN [value]\\n\");\n"
"\treturn 0;\n"
"}/*end main*/\n";
printf("Normal Code::\n%s\n\n",ccode);
char uncomment[1024];
removecomment(ccode,uncomment);
printf("No COmment::\n%s\n\n",uncomment);
return 0;
}