Newsgroup: it.comp.lang.c
Titolo: segmentation fault

Salve,
ho un prog che manipola stringhe.
Chiede in input un file html che contiene delle thumbnails formattato
con le immagini una sotto l'altra. Il mio prog lo riformatta, mette le
immagini in riga e fa delle cosette per abbellire.
Ora, in win funziona tutto ok, in linux compila senza errori ma
l'esecuzione da' un segmentation fault. Ho trovato che sto messaggio
avverte che si sta scrivendo su un'area di memoria gia' occupata, e'
vero?
Dato cio', non riesco a capire come correggere. Qualcuno puo' darmi una
dritta?
Il prog (macchinoso, lo so...) segue.
Grazie in anticipo,
mirko
---------------------------
---------------------------
#include <stdio.h>
#include <string.h>
/*#define IMAGES_PER_LINE 5;*/
static char *strnset(char *string, int c, size_t n)
{
  char *s = string;
  if (!s) return s;
  for (;*s && n; n--)
    *s++ = c;
  return string;
}
int main()
{
      FILE *fp_read;
      FILE *fp_write;
      char oneline[100];
      char *new_oneline,*temp;
      char new_oneline0[100];
      char file_name_input[32];
      char path_root[512]="/home/_mysite_/";
      char begin_document_headers1[]="<HTML><HEAD><TITLE>";
      char begin_document_headers2[]="</TITLE></HEAD><BODY
BGCOLOR=\"FFF5EE\"><CENTER>\n\n";
      char end_document_headers[]="</CENTER></BODY>\n\n</HTML>\n\n";
      char begin_table_header1[]="<TABLE BORDER=\"7\" CELLSPACING=\"50\"
CELLPADDING=\"1\" BORDERCOLOR=\"FF0000\">\n<CAPTION>";
      char begin_table_header2[]="</CAPTION>\n\n";      
      char end_table_header[]="</TABLE>\n\n";
      char path_input[1024];
      char path_output[2048];
      char word_void[]=" \n";
      char word_void_tab[]=" ";
      char *c;
      char *string2;
      int count=0;
      int word_count=0;
      int image_count=5; int i=0;
 
 
      printf("\n\n\t\tThumbnailers fix! by MB\n");
      printf("\t\t-----------------------\n");
      printf("\nName of the file to be processed, with no extension:-
");
      scanf("%s", &file_name_input);
      /* cat input file name */
      strcat(path_root,file_name_input);
      strcat(path_root,"/");
      strcat(path_root,file_name_input);
      strcpy(path_input,path_root);
      strcat(path_root,".html");
      /* cat output file name */
      strcpy(path_output,path_input);
 
      strcat(path_output,"_corr.html");
      fp_read=fopen(path_root,"r");
      fp_write=fopen(path_output,"w");
 
      /********** clean headers ****************/
      do{
      c=fgets(oneline,100,fp_read);
      if (c!=NULL) {
 
               if (0==strncmp(oneline,"<",1))                  
               fputs(word_void_tab,fp_write);                     
               }
               }while(word_count++<7);
      /***************************************/         
 
      /********** new dcoument headers ****************/         
      fputs(begin_document_headers1,fp_write);
      fputs("Martina - ",fp_write);
      fputs(file_name_input,fp_write);
      fputs(begin_document_headers2,fp_write);                 
      /***************************************/  
 
      /********** table headers ****************/         
      fputs(begin_table_header1,fp_write); 
      fputs("<H1><FONT COLOR=\"FF0000\">Martina - ",fp_write);
      fputs(file_name_input,fp_write);  
      fputs("</FONT></H1>",fp_write);
      fputs(begin_table_header2,fp_write); 
      /*fputs("<BR><BR>",fp_write); */             
      /***************************************/  
 
      /********** re-write main file ****************/         
      do{
         c=fgets(oneline,100,fp_read);         
             if (c!=NULL) {                       
 
               if (0==strncmp(oneline,"<A HREF",7) &&
(image_count%5==0)) {
                   fputs("<TR>\n",fp_write);
                   fputs("<TD ALIGN = \"center\">\n",fp_write);
                   fputs(oneline,fp_write); 
               }
 
               if (0==strncmp(oneline,"<A HREF",7) && image_count%5!=0)
{
                   fputs("<TD ALIGN = \"center\">\n",fp_write);
                   fputs(oneline,fp_write); 
               }
 
 
 
               else if (strstr(oneline,">IMG_")!=NULL)  {
 
                           image_count++;
                           temp=strstr(oneline,">IMG_");
                           string2=strstr(temp,"I");
 
                           if (image_count%5==0)           
new_oneline=strcat(strcat(strcat(oneline,strnset(strnset(
strstr(oneline,string2), '\0',2),'>',1)),"</A>\n</TD>\n"),"</TR>\n");
 
                           else if (image_count!=0)  
new_oneline=strcat(strcat(oneline,strnset(strnset(
strstr(oneline,string2), '\0',2),'>',1)),"</A>\n</TD>\n");
 
                           fputs(new_oneline,fp_write); 
 
               }                        
 
               if (0==strncmp(oneline,"</A><BR><BR>",12))
                           fputs(word_void,fp_write);   
 
             }
      } while (c!=NULL);
 
      /********** end table header ****************/         
      fputs(end_table_header,fp_write);                  
      /***************************************/  
 
      /********** end document headers ****************/         
      fputs(end_document_headers,fp_write);                  
      /***************************************/ 
 
 
      fclose(fp_read);
      fclose(fp_write);
      return 0;
}
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

                            fputs(new_oneline,fp_write); 
Mi fermo... ma spero di essere stato chiaro.
Ciao
-- 
Cybertoldo
Per rispondermi via email, sostituisci moc.liamg con 
gmail.com

 dritta?
Te ne do 3.
 1. riscrivi il programma senza usare 'strcat'
 2. controlla i valori restituiti dalla funzioni (ad es. 'fopen')
 3. esegui il programma con gdb
M

      c=fgets(oneline,100,fp_read);
Anziché il literal 100, usa:
  sizeof oneline
Visto che hai dichiarato oneline come array (e non come puntatore), il
valore restituito da sizeof equivale alla dimensione in byte
dell'array.
Cerca di suddividere il tuo programma in moduli più piccoli: funzioni.
Sarà più facile fare il debug.