Y3PP4
03-08-2009, 16:01
Giorno a tutti, stò scrivendo un piccolo parser e tra i vari passi da seguire c'è quello di rimuovere i commenti e gli spazi bianchi (in modo da poter effettuare token senza problemi dei blank spaces).
Semplificando la funzione incriminata ho ricostruito il programma con la singola funzione e un main che la richiama.
L'algoritmo è molto semplice: tramite una switch inserita in una for che cicla i caratteri della riga elimina tabulazioni, blank spaces, e commenti.
Per verificare il funzionamento dell'algoritmo in sè ho modificato il programma facendogli direttamente mostrare i caratteri della stringa che non siano i suddetti da eliminare e tutto viene mostrato correttamente.
escaping2.c (codice funzionante ma non è ciò che mi serve - esegue solo l'algoritmo)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
static void EscapeString( char *source )
{
unsigned int i;
unsigned int isCommentLine = 0; /*on 1 the line will be discarded - is a comment line*/
//char *bufString;
for( i = 0; i < strlen(source); i++ )
{
switch( source[i] )
{
case '\t':
case ' ' :
break;
case '#' :
isCommentLine = 1;
break;
default :
printf("%c", source[i]);
break;
}
if(isCommentLine) /* != 0"*/
{
return;
}
}
return;
} /*EscapeString*/
int main()
{
char *string = "this is a string #and this is a comment that will not show.";
EscapeString(string);
return 0;
}
Ma se invece voglio raccogliere in una stringa i caratteri non riesco proprio.
Ottengo sempre un segmentation fault e gdb si blocca sulla chiamata alla funzione, quindi è quella che non lavora a dovere.
Ora mostro lo stesso algoritmo che dovrebbe ritornare la stringa:
blank.c (segmentation fault)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define CRLF
static char *EscapeString( char *source )
{
unsigned int i;
unsigned int isCommentLine = 0; /*on 1 the line will be discarded - is a comment line*/
char *bufString;
for( i = 0; i < strlen(source); i++ )
{
switch( source[i] )
{
case '\t':
case ' ' :
break;
case '#' :
isCommentLine = 1;
break;
default :
bufString += source[i];
break;
}
if(isCommentLine) /* != 0"*/
{
return bufString;
}
}
return bufString;
} /*EscapeString*/
int main()
{
char *String = "this is a string #and this is a comment that will not show.";
char *escapedString = EscapeString(String);
printf("%s" CRLF, escapedString);
return 0;
}
Premetto che una volta risolto questo problema la funzione userà questo prototipo:
static char *EscapeString( char *dest, char *source );
in modo da accettare come input anche la stringa in cui conservare la stringa elaborata ed evitare di scrivere questo poco elegante: char *escapedString = EscapeString(string); ma il problema è lo stesso.
Ringrazio chiunque saprà dirmi cosa sbaglio... è da sabato che ci sto lavorando sopra e ho spulciato tutto google ma non ne sono venuto a capo.
Ps. Ho provato con strcat e strcpy lavorando sui puntatori, ma stesso risultato.
Semplificando la funzione incriminata ho ricostruito il programma con la singola funzione e un main che la richiama.
L'algoritmo è molto semplice: tramite una switch inserita in una for che cicla i caratteri della riga elimina tabulazioni, blank spaces, e commenti.
Per verificare il funzionamento dell'algoritmo in sè ho modificato il programma facendogli direttamente mostrare i caratteri della stringa che non siano i suddetti da eliminare e tutto viene mostrato correttamente.
escaping2.c (codice funzionante ma non è ciò che mi serve - esegue solo l'algoritmo)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
static void EscapeString( char *source )
{
unsigned int i;
unsigned int isCommentLine = 0; /*on 1 the line will be discarded - is a comment line*/
//char *bufString;
for( i = 0; i < strlen(source); i++ )
{
switch( source[i] )
{
case '\t':
case ' ' :
break;
case '#' :
isCommentLine = 1;
break;
default :
printf("%c", source[i]);
break;
}
if(isCommentLine) /* != 0"*/
{
return;
}
}
return;
} /*EscapeString*/
int main()
{
char *string = "this is a string #and this is a comment that will not show.";
EscapeString(string);
return 0;
}
Ma se invece voglio raccogliere in una stringa i caratteri non riesco proprio.
Ottengo sempre un segmentation fault e gdb si blocca sulla chiamata alla funzione, quindi è quella che non lavora a dovere.
Ora mostro lo stesso algoritmo che dovrebbe ritornare la stringa:
blank.c (segmentation fault)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define CRLF
static char *EscapeString( char *source )
{
unsigned int i;
unsigned int isCommentLine = 0; /*on 1 the line will be discarded - is a comment line*/
char *bufString;
for( i = 0; i < strlen(source); i++ )
{
switch( source[i] )
{
case '\t':
case ' ' :
break;
case '#' :
isCommentLine = 1;
break;
default :
bufString += source[i];
break;
}
if(isCommentLine) /* != 0"*/
{
return bufString;
}
}
return bufString;
} /*EscapeString*/
int main()
{
char *String = "this is a string #and this is a comment that will not show.";
char *escapedString = EscapeString(String);
printf("%s" CRLF, escapedString);
return 0;
}
Premetto che una volta risolto questo problema la funzione userà questo prototipo:
static char *EscapeString( char *dest, char *source );
in modo da accettare come input anche la stringa in cui conservare la stringa elaborata ed evitare di scrivere questo poco elegante: char *escapedString = EscapeString(string); ma il problema è lo stesso.
Ringrazio chiunque saprà dirmi cosa sbaglio... è da sabato che ci sto lavorando sopra e ho spulciato tutto google ma non ne sono venuto a capo.
Ps. Ho provato con strcat e strcpy lavorando sui puntatori, ma stesso risultato.