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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 16
    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
    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.

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 660
    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
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 16
    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
    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

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    309
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 309
    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...

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

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

  8. #8
    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
    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.

+ 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