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 :

"stack smashing detected" encore... [Débutant(e)]


Sujet :

C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 16
    Points : 7
    Points
    7
    Par défaut "stack smashing detected" encore...
    Bonjour
    J'ai presque exactement le même problème que djldjl là:
    http://www.developpez.net/forums/sho...stack+smashing

    Seulement je suis comme lui , je ne vois pas du tout comment changer la taille d'une pile afin de ne plus avoir cet horrible message d'erreur...
    (je me suis fais démolir par millie là ...) .
    A tout hasard je précise que pour écrire mes (humbles) programmes j'utilise gedit , sur Ubuntu.

    et au cas où on me le demande encore, voilà mon code
    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
    26
    27
    28
    29
    30
     
    #include <stdio.h>
     
    int main (void)
     
    {
    char base[64];
    printf ("chaine :");
    scanf ("%s", &base[64]);
    switch (base[64])
    {
    case 'A' : 
    printf ("c'est un adn\n");
    break;
    case 'T' : 
    printf ("c'est un adn\n");
    break;
    case 'G' : 
    printf ("c'est un adn\n");
    break;
    case 'C' : 
    printf ("c'est un adn\n");
    break;
    default :
    printf ("ce n'est pas un adn\n");
    break;
    }
     
    return 0;
    }

  2. #2
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    Pour une foi mon blocage n'est pas dût à mes lacunes en écriture , mais à mon ignorance des arcanes obscure du compilateur , semble-t-il
    Ton problème n'est pas lié à la taille de la pile mais à un mauvais code (et à une mauvaise connaissance du C)



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char base[64];
    printf ("chaine :");
    scanf ("%s", &base[64]);
    Déjà, tu as un tableau de taille 64, donc le dernier élément est en 63. &base[64], c'est une adresse après le tableau qui est invalide. Faire un scanf là dessus va faire écrire n'importe quoi. Il est d'ailleurs conseillé d'utiliser %64s dans ce cas pour éviter un dépassement du buffer.

    Donc, scanf("%63s", &base[0]); devrait déjà mieux aller.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    switch (base[64])
    {
    case 'A' :
    Là, tu vas regarder l'élément à la position 64, qui est forcement hors tableau.

    Essaye avec base[0].

    A noter que cette méthode ne fonctionne que pour tester un seul caractère.
    Je ne répondrai à aucune question technique en privé

  3. #3
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 647
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 647
    Points : 11 136
    Points
    11 136
    Par défaut
    à moins que Millie ne me contredise, et si mes souvenirs sont bons tu peux écrire :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    char base[64];
    printf ("chaine :");
    scanf ("%s", base);
    sans le & devant base (!) car base est l'adresse de la chaine de caractères.
    Néanmoins, il ne faut pas que l'utilisateur tape plus de 63 caractères, le dernier étant reservé au caractèe de fin de chaine, le \0

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    Merci auteur et millie ,j'essaierais
    même s'il me semble que j'avais mis le & pour éviter un autre message d'erreur, maispour l'instant je vais me coucher.

    la limite de 63 caractères c'est voulus.

    je précise pour millie que je dois pouvoir tester plusieurs caractères.

  5. #5
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    Citation Envoyé par Auteur Voir le message
    à moins que Millie ne me contredise, et si mes souvenirs sont bons tu peux écrire :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    char base[64];
    printf ("chaine :");
    scanf ("%s", base);
    sans le & devant base (!) car base est l'adresse de la chaine de caractères.
    Néanmoins, il ne faut pas que l'utilisateur tape plus de 63 caractères, le dernier étant reservé au caractèe de fin de chaine, le \0
    Oui, on peut écrire comme ça mais j'avais donné l'exemple &base[0] pour bien montrer que c'est l'adresse du premier élément (indice 0). Pour le problème des dépassement de buffer, il faut utiliser %ns où n est le nombre maximal de caractères.
    Je ne répondrai à aucune question technique en privé

  6. #6
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    Citation Envoyé par incal Voir le message
    je précise pour millie que je dois pouvoir tester plusieurs caractères.
    Je parlais de chaine de caractères

    Par exemple,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    switch(base) {
     case "machin":
     
    }
    ne fonctionne pas.

    Mais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    switch(base[0]) {
     case 'm':
     
     case 'n':
    }
    fonctionne
    Je ne répondrai à aucune question technique en privé

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    308
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 308
    Points : 373
    Points
    373
    Par défaut
    Si tu dois comparer ce qui est entré avec une chaîne de caractères entières, il vaut mieux utiliser la fonction strcmp() qui te retourne un entier indiquant, s'il est égal à 0, que les deux chaînes sont équivalentes...

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    merci à tous pour votre aide , je reverrai tout ça à la première heure demain , en attendant , bonne nuit

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 16
    Points : 7
    Points
    7
    Par défaut ce n'est pas encore ça :(
    Donc maintenant j'ai ce code ,qui marche un peu mieu
    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
    26
    27
    28
    29
    30
     
    #include <stdio.h>
     
    int main (void)
     
    {
    char base[64];
    printf ("chaine :");
    scanf ("%64s", &base[60]);
    switch (base[0])
    {
    case 'A' : 
    printf ("c'est un adn\n");
    break;
    case 'T' : 
    printf ("c'est un adn\n");
    break;
    case 'G' : 
    printf ("c'est un adn\n");
    break;
    case 'C' : 
    printf ("c'est un adn\n");
    break;
    default :
    printf ("ce n'est pas un adn\n");
    break;
    }
     
    return 0;
    }
    je n'ai pas de message d'erreur pour les petites séquences genre
    CY , GY , ACY , ou même ACGY , ou encore ATCG
    et même s'il n'ya que les bonnes lettres , ça me dit toujours que ce n'est pas un adn

    en plus dès que j'essaie une séquence plus complète ,
    comme ATTCGC , ou ACGTY
    le stack smashing revient
    serait-ce bien un problème de pile finalement ?

  10. #10
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    Je crois que tu dois définir déjà ce qu'est un ADN (par exemple sous forme d'algorithme) avant d'écrire ton programme.

    Car pour l'instant, l'algorithme de ton programme est le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Entrée un caractère
    Si c'est A, T, G ou C alors indique que c'est un ADN
    Sinon indiquer que s'en est pas un
    Je ne répondrai à aucune question technique en privé

  11. #11
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par incal Voir le message
    Donc maintenant j'ai ce code ,qui marche un peu mieu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    {
    char base[64];
     
    scanf ("%64s", &base[60]);
    Horrible ! "%s" attend l'adresse du premier élément d'un tableau de char....
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    scanf ("%63s", &base[0]);
    ce qui s'ércit aussi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    scanf ("%63s", base + 0);
    ou encore
    tout simplement.

    63, parce qu'il faut laisser une place pour le 0 final...
    Pas de Wi-Fi à la maison : CPL

  12. #12
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 16
    Points : 7
    Points
    7
    Par défaut ça y est , ça marche !
    argh !
    Effectivement , j'ai pas fais assez attention au 0 final
    et pourtant vous êtes pas les seuls à m'avoir bassiné là dessus

    merci encore

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 21/12/2010, 21h54
  2. stack smashing detected lors d'une lecture de fichier
    Par Dave62 dans le forum Débuter
    Réponses: 5
    Dernier message: 06/11/2009, 13h50
  3. Probléme * stack smashing detected *
    Par Mat262 dans le forum Débuter
    Réponses: 13
    Dernier message: 23/12/2008, 21h34
  4. Problème de "stack smashing detected"
    Par Mr Light dans le forum C++
    Réponses: 9
    Dernier message: 29/02/2008, 09h09
  5. stack smashing detected et sscanf
    Par vinzzzz dans le forum Bibliothèque standard
    Réponses: 34
    Dernier message: 03/12/2007, 16h50

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