Uscita dal ciclo inspiegabile

di il
2 risposte

Uscita dal ciclo inspiegabile

Sto scrivendo un esercizio che dovrebbe togliere i commenti da un programma c, quindi cancellare stampare tutto l'input tutto quello che c'è tra // e '\n' e tutto quello che c'è tra /* e */, per quanto riguarda //-\n funziona, però /**/ da problemi:
#include <stdio.h>
#define MAXCHAR 1000
#define OUT 0
#define IN 1
int getline(char line[],int maxchar)
{
	int i,c;
	for (i=0;(c=getchar())!=EOF && c!='\n' && i<maxchar-1;i++)
	{
		line[i]=c;
	}
	if(c=='\n')
	{
		line[i]=c;
		i++;
	}
	line[i]='\0';
	return i;
}
void removecomment(char from[],char to[])
{
	int i,;
	i=0;
	for(i=0;from[i]!='\0';i++)
	{
		if(from[i]=='/' && from[i+1]=='/')
		{
			for(;from[i]!='\n';i++)
			to[i]='\0';	
		}
		else if(from[i]=='/' && from[i+1]=='*')
		{
			while(from[i]!='*' && from[i+1]!='/')
			i++;				
		}
		else
		{
			to[i]=from[i];
		}
	}
	to[i]='\0';
}
main()
{
	int gl;
	char line[MAXCHAR],result[MAXCHAR];
	while ((gl=getline(line,MAXCHAR))>0)
	{
		removecomment(line,result);
		printf("%s\n",result);
	}
}
l'errore sta nel ciclo while all'interno dela funzione removecomment(), sembra come se uscisse dal ciclo appena vede un *, invece che /* eppure nel while è indicato * && / ma si comporta come un ||

2 Risposte

  • Re: Uscita dal ciclo inspiegabile

    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;
    }
    
  • Re: Uscita dal ciclo inspiegabile

    Sì, così sicuramente risulta più chiaro... provo a modificarlo, grazie
Devi accedere o registrarti per scrivere nel forum
2 risposte