IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

problème avec les pointeurs : "Erreur de segmentation"


Sujet :

C

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 15
    Points : 12
    Points
    12
    Par défaut problème avec les pointeurs : "Erreur de segmentation"
    Bonjour, j'ai un problème, lorsque je lance mon programme, j'ai une erreur de segmentation. Je pense que cela vient de mon utilisation des pointeurs qui ne doit pas être encore au point. C'est pour cela que je viens vous demandé de l'aide, j'ai beau réfléchir je ne vois pas vraiment d'où ça peut venir.
    J'ai eu cette erreur dans deux programme : "my_revstr" et "my_strstr".
    Je vous laisse les codes ci-dessous :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    #include <stdio.h>
    #include <string.h>
     
    char *my_revstr(char *str)
    {
    	char string[255];
    	int len, n;
     
    	strcpy(string, str);
    	len = strlen(string);
    	for(n = 0; n!=len; n++)
    	{
    		*(str+n) = string[len];
    		len--;
    	}
    }
     
    int main()
    {
    	char string[12] = "Hello World\0";
    	printf(string);
    	my_revstr(string);
    	printf(string);
    	return (0);
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    #include <stdio.h>
    #include <string.h>
    char *my_strstr(char *str, char *to_find)
    {
    	char *string;
     
    	while (*str != *to_find)
    	{
    		str++;
    	}
     
    	strncpy(string, str, strlen(to_find));	
     
    	return (str);
    }
     
    int main()
    {
    	char string[12] = "Hello World\0";
    	char *str = my_strstr(string, "ello");
    	printf("%s\n", str);
     
    	return (0);
    }
    Merci d'avance pour vos réponses !

  2. #2
    Membre expérimenté
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    543
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 543
    Points : 1 745
    Points
    1 745
    Par défaut
    Bonjour

    Votre programme comporte des instructions à ne pas faire car elles sont très dangereuses je parle de printf(string); et strcpy(string, str); car elles peuvent être exploitées. Je vous conseille donc de revoir le manuel du langage C et l'emploi des fonctions citées précédemment et leurs informations sur leur vulnérabilité.

    Deuxième point vous avez une variable pointeur sur char qui n'a pas été initialisée et qui pointe sur aucune zone mémoire allouée dynamiquement qui est utilisée (manque d'allocation dynamique de mémoire).

    Revoir aussi la réflexion et l'implémentation de votre algorithme car il faut savoir qu'un programme informatique fait toujours ce qui est écrit et pas forcément ce qu'on a souhaité qu'il fasse donc, il faut relire le code tel qu'il est écrit et non comme celui qu'on a voulu écrire... A ceci je pose une question si vous avez déjà effectue une copie à quoi ça sert d'effectuer une autre copie ?
    (utiliser également un débogueur)
    Citation Envoyé par Deezio Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    char *my_revstr(char *str)
    {
    	char string[255];
    	int len, n;
     
    	strcpy(string, str);
    	len = strlen(string);
    	for(n = 0; n!=len; n++)
    	{
    		*(str+n) = string[len];
    		len--;
    	}
    }
    à bientôt
    Celui qui peut, agit. Celui qui ne peut pas, enseigne.
    Il y a deux sortes de savants: les spécialistes, qui connaissent tout sur rien,
    et les philosophes, qui ne connaissent rien sur tout.
    George Bernard Shaw

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 9
    Points : 22
    Points
    22
    Par défaut
    Bonjour,

    Bon, on va faire par étape.

    Pour la fonction my_strstr :
    - Bien vérifier que les arguments passés sont valides (!= NULL)
    - Je pense que string ne sert à rien, je pense que tu veux retourner le pointeur sur le premier caractère de la chaîne "str" qui correspond à la chaîne "to_find".
    - La condition de la boucle while n'est pas bonne car si le premier caractère de ta chaîne "to_find" n'est pas dans la chaîne "str" alors "catastrophe"... Il faut que tu t'arrêtes à la fin de la chaîne "str" ou quand tu as trouvé "to_find"
    - Par contre, si tu cherches "eno" dans "hello world", vu ton algo et ben tu vas le trouver.
    - Enfin pour parcourir ta chaîne je ferais comme ça *(str + i) et incrémenter i.

    Pour trouver une sous-chaine, il faut que tous les caractères de "to_find" soient présent dans "str", donc si tu as le premier, il faut faire l'égalité sur le deuxième et ainsi de suite...

    Essaye de d'améliorer ton code pour cette fonction...

    Bon courage,

    Matt...

  4. #4
    Expert confirmé Avatar de ed73170
    Homme Profil pro
    Développeur indépendant
    Inscrit en
    Mai 2009
    Messages
    765
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur indépendant

    Informations forums :
    Inscription : Mai 2009
    Messages : 765
    Points : 5 522
    Points
    5 522
    Par défaut
    En utilisant un débugger pour vérifier ton code tu aurais pu constater que ta boucle

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for(n = 0; n!=len; n++)
    	{
    		*(str+n) = string[len];
    		len--;
    	}
    ne se termine jamais parce que la condition de fin n'est pas satisfaite. En règle générale on évite de modifier la variable servant de test pour la sortie d'une boucle (ici len).

    Tu pourrais écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for (n = 0; n != len; n++)
    	{
    		*(str + n) = string[len - n - 1];
     	}
    Par ailleurs, l'initialisation de ta chaîne n'est pas correcte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char string[12] = "Hello World\0";
    car une constante de type chaîne se termine implicitement par un '\0', donc ta constante "Hello World\0" fait 13 caractères et pas 12, il faut juste écrire "Hello World".

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 15
    Points : 12
    Points
    12
    Par défaut
    Merci beaucoup à tous ! Je pense avoir compris mes erreurs sur le my_revstr, et je vais essayer de faire fonctionner mon my_strstr. Je tiens a préciser qu'il y avait dans ce dernier des erreurs au niveau de l'algorithme comme :
    Pour trouver une sous-chaine, il faut que tous les caractères de "to_find" soient présent dans "str", donc si tu as le premier, il faut faire l'égalité sur le deuxième et ainsi de suite...
    mais c'était simplement car je préfère faire mon programme par étape, et comprendre au fur et à mesure ce qui ne fonctionne pas, pour ne pas me retrouver avec mon programme fini qui ne fonctionne pas et ne sachant pas où chercher.
    Sur ce je vais voir pour utilisé un débugger, je ne connaissais pas, je vais donc m'informer là dessus !
    Encore merci !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème avec les messages d'erreur.
    Par gaet_045 dans le forum JSF
    Réponses: 1
    Dernier message: 01/05/2007, 15h47
  2. Petit problème avec les pointeurs et variable
    Par mitherkiller dans le forum C
    Réponses: 5
    Dernier message: 09/03/2007, 22h05
  3. problème avec les pointeurs en c
    Par dialloma dans le forum C
    Réponses: 14
    Dernier message: 01/01/2007, 21h22
  4. probléme avec les pointeurs
    Par killer_instinct dans le forum C++
    Réponses: 6
    Dernier message: 11/12/2006, 11h37
  5. [TTreeView] Problème avec les pointeurs d'objet
    Par BlackWood dans le forum Composants VCL
    Réponses: 2
    Dernier message: 02/07/2004, 14h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo