Erreur de segmentation (core dumped)

srakawa Messages postés 1 Date d'inscription   Statut Membre Dernière intervention   -  
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   -
Avec ce code qui compile bien, je sais bien qu'il s'agit d'un pb de mémoire
La plus longue variable fera moins de 80 caractères.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define TAILLE_MAX 10000
char *str_sub (const char *s, unsigned int start, unsigned int end)
{
char *new_s = NULL;

if (s != NULL && start < end)
{
/* (1)*/
new_s = malloc (sizeof (*new_s) * (end - start + 2));
if (new_s != NULL)
{
int i;

/* (2) */
for (i = start; i <= end; i++)
{
/* (3) */
new_s[i-start] = s[i];
}
new_s[i-start] = '\0';
}
else
{
fprintf (stderr, "Memoire insuffisante\n");
exit (EXIT_FAILURE);
}
}
return new_s;
}

int main(void)
{
FILE* fichier = NULL;
char *prov = malloc (sizeof (*prov) * 256);
char chaine[TAILLE_MAX] = "";
char *extrait = malloc (sizeof (*extrait) * 256);
char *httpd_root = malloc (sizeof (*httpd_root) * 256);
char *conf = malloc (sizeof (*conf) * 256);
char *chemin_conf = malloc (sizeof (*chemin_conf) * 256);
char *commande = malloc (sizeof (*commande) * 1024);
commande = "grep 'DocumentRoot' ";
//char* prov;
int taille;
system ("clear");
printf ("======================================================================\n");
printf ("| |\n");
printf ("| Recherche de la racine des documents de votre serveur WEB |\n");
printf ("| |\n");
printf ("| |\n");
printf ("| (c) 2014 Michel Billard |\n");
printf ("| |\n");
printf ("======================================================================\n\n\n\n\n\n");
system ("grep 'DocumentRoot' /etc/httpd/conf/httpd.conf > fic1.cor");
system ("clear");

system ("httpd -V > fic.cor");
system ("clear");
printf ("======================================================================\n");
printf ("| |\n");
printf ("| Recherche de la racine des documents de votre serveur WEB |\n");
printf ("| |\n");
printf ("| |\n");
printf ("| (c) 2014 Michel Billard |\n");
printf ("| |\n");
printf ("======================================================================\n\n\n\n\n\n");
fichier = fopen ("fic.cor", "r");
if (fichier == NULL)
{
printf("Impossible d'ouvrir le fichier fic.txt");
return -1;
}
else
{
while (fgets(chaine, TAILLE_MAX, fichier) != NULL) // On lit le fichier tant qu'on ne reçoit pas d'erreur (NULL)
{
extrait = strstr (chaine, "HTTPD_ROOT");
if (extrait != NULL)
{
prov = strstr(extrait, "/");
taille= strlen(prov);
strncpy (httpd_root, prov, taille-2);
}
extrait = strstr (chaine, " SERVER_CONFIG_FILE");
if (extrait != NULL)
{
prov = strstr(extrait, "\"");
taille= strlen(prov);
conf = str_sub(prov, 1, taille -3);// (conf, prov, taille-2);
chemin_conf = strcat(httpd_root, "/");
chemin_conf = strcat(chemin_conf, conf);
printf ("%s: %s\n\n", "Voici le chemin de httpd.conf", chemin_conf);
}

}
fclose (fichier);
//fonctionne parfaitement si je commente la ligne ci-dessous
commande = strcat(commande, chemin_conf);
printf("La commande à taper est %s%s\n\n", commande, chemin_conf);
}
return 0;
}
A voir également:

1 réponse

fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Bonjour,

Pourquoi enlever le "Bonjour" placé automatiquement ???
Merci de faire usage de plus de politesse.
De plus, votre code est illisible (il faut utiliser les balises "code c" prévues à cet effet).
Du coup, je n'ai pas tout lu.

Mais déjà :
new_s = malloc (sizeof (*new_s) * (end - start + 2));
for (i = start; i <= end; i++)

i doit aller de 0 à end-start+2 (non compris).

char *commande = malloc (sizeof (*commande) * 1024);
commande = "grep 'DocumentRoot' ";
Fuite de mémoire... Soit tu fais char *commande="grep 'DocumentRoot' "; soit tu fais char*commande=malloc(...); puis strcpy(commande,"grep 'DocumpentRoot' ");

Pour info, les commandes system() sont à éviter... Sinon, autant faire du shell...
0