Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 30/05/2006, à 18:31

Premium

[C] Erreur de segmentation

Bonjour,

Je compile mon programme en faisant un make
lorsque j'execute mon programme, j'obtiens une erreur de segmentation
Avec gdb, j'obtiens ceci :

Program received signal SIGSEGV, Segmentation fault.
0xb7e52c20 in strcpy () from /lib/tls/i686/cmov/libc.so.6

Quel est le problème ?
Pourriez-vous m'aider à corriger mon code?


Merci par avance

VerifIP, vérifies si une IP est correcte avant de la mettre dans le tableau

le seul fichier code ou j'utilise strcpy est celui-ci

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>

#include "verifIP.h"
#include "parsing.h"

#define F "fichier"

void purge(FILE *fp)
{
  int c;
  while ((c = fgetc(fp)) != '\n' && c != EOF)
    {
    }
}

void clean (char *s, FILE *fp)
{
  char *p = strchr (s, '\n');
  if (p != NULL)
    {
      *p = 0;
    }
  else
    {
      purge (fp);
    }
}

char **parsing(FILE *fp)
{
  char **tab;
  int nb = 0 ,size = 5;
  
  tab = malloc (size * sizeof * tab);
  if(tab == NULL)
    {
      perror("erreur allocation\n");
      exit(1);
    }
  
  if (fp != NULL)
    {
      char line[BUFSIZ];
      
      while(fgets(line, sizeof line, fp) != NULL)
	{
	  clean(line, fp);
	  char *p = strtok(line," ");
	  if (p != NULL)
	    {
	      p = strtok(NULL," ");
	      if (p != NULL)
		{ 
		  if(nb == size)
		    {
		      size += 16;
		      
		      tab = realloc(tab, size * sizeof *tab);
		      if (tab == NULL)
			{
			  perror("erreur allocation\n");
			  free(tab); tab = NULL;
			  return tab;
			}
		    }
		  int ip[4];
		  int n = sscanf(p,"%d.%d.%d.%d",ip,ip+1,ip+2,ip+3);
		  if(n == 4)
		    {
		      tab[nb] = malloc((strlen(p)+1) * sizeof * tab[nb]);
		      if (tab[nb] == NULL)
			{
			  perror("erreur allocation\n");
			  free(tab); tab = NULL;
			  return tab;
			}
		      if(!correctIP(p))
			{
[b]			  strcpy(tab[nb],p);[/b]
			  nb++;
			}
		    }
		}
	      
	      else
		{
		  printf ("format error\n");
		  break;
		}
	    }
	  else
	    {
	      printf ("format error\n");
	      break;
	    }
	}
      fclose (fp), fp = NULL;
      tab[nb] = NULL;
    }
  else
    {
      perror (F);
    }
  assert (fp == NULL);
  return tab;  
}

Hors ligne