mon programme bug a la fin !
Répondre à la discussion
Affichage des résultats 1 à 8 sur 8

mon programme bug a la fin !



  1. #1
    invite2d201af9

    mon programme bug a la fin !


    ------

    bonjour
    j'ai créer un petit programme qui supprime les espaces dans une chaine.
    mais a la fin il bug et je sais pas pourquoi !!!
    voila le code :
    Code:
    #include <iostream>
    
    using namespace std;
    
    int main(int argc, char *argv[])
    {
    
        char chaine[]="";
        int longueurChaine=0;
    
        cout <<"entrer une chaine :";
        cin.getline(chaine, 150);
        cout <<"\n";
    
        longueurChaine = strlen( chaine );
    
        for(int i=0;i<=longueurChaine;i++)
        {
            if(chaine[i]==' ')
            {
                cout<<"";
            }
            else
            {
                cout<<chaine[i];
            }
        }
    
        return 0;
    }

    -----

  2. #2
    erik

    Re : mon programme bug a la fin !

    Salut,

    Tu lis un caractère de trop.
    Imagine une chaine de 1 caractère : "a", strlen( chaine ) va retourner 1 et dans ta boucle tu va lire chaine[0] (c'est ok c'est a) puis tu vas tenter de lire chaine[1] et là il aime pas.

    Ecrit
    Code:
    for(int i=0;i<longueurChaine;i++)
    ça devrai passer.

    Toujours se souvenir que le dernier caractère d'une chaine est chaine[strlen(chaine)-1].

  3. #3
    whoami

    Re : mon programme bug a la fin !

    Bonjour,

    Et surtout, quand tu écris
    Code:
        char chaine[]="";
    tu définis chaine comme une chaine de 1 caractère, seul caractère de la chaine, contenant 0, marque de fin de chaine en C.

    Tout accès au-delà de ce caractère chaine[0] entraîne une erreur (qui, par malchance, peut ne pas être détectée immédiatement).

  4. #4
    invite2d201af9

    Re : mon programme bug a la fin !

    merci !
    Code:
    include <iostream>
    
    using namespace std;
    
    int main(int argc, char *argv[])
    {
    
        char chaine[150];
        int longueurChaine=0;
    
        cout <<"entrer une chaine :";
        cin.getline(chaine, 150);
        cout <<"\n";
    
        longueurChaine = strlen( chaine );
    
        for(int i=0;i<=longueurChaine;i++)
        {
            if(chaine[i]==' ')
            {
                cout<<"";
            }
            else
            {
                cout<<chaine[i];
            }
        }
    
        return 0;
    }

  5. A voir en vidéo sur Futura
  6. #5
    ProgVal

    Re : mon programme bug a la fin !

    Bonjour,

    Et si tu veux une chaine de longueur variable (donc, qui ne prend en mémoire que ce dont elle a besoin), tu peux utiliser la classe String

    Cordialement,
    ProgVal

  7. #6
    whoami

    Re : mon programme bug a la fin !

    Bonjour,
    Citation Envoyé par ProgVal Voir le message
    Bonjour,

    Et si tu veux une chaine de longueur variable (donc, qui ne prend en mémoire que ce dont elle a besoin), tu peux utiliser la classe String

    Cordialement,
    ProgVal
    string en C++.

  8. #7
    ProgVal

    Re : mon programme bug a la fin !

    Au temps pour moi, désolé. (j'ai encore presque jamais codé en C++)

  9. #8
    Towl

    Re : mon programme bug a la fin !

    Mmm bizarre ta facon de parcourir ta chaine, je pense que tu vas un poil trop loin

    Code:
     longueurChaine = strlen( chaine );
    
        for(int i=0;i<=longueurChaine;i++)
    Donc ici, tu itéres longueurChaine + 1 fois (soit 151 fois dans ton exemple). N'oublie pas que l'on compte toujours de 0 en informatique et en programmation, donc on ne mets pas de <= mais un <.


    Dans le cas ou l'on rentre la chaine "AA", sa représentation mémoire est 0x65 0x65 0x00, c'est à dire : 'A' 'A' '\0'. Le dernier caractère sert de fin de chaine. Avec ta boucle, tu obtiendras une longueur de 2 (strlen s'arrete dès qu'il rencontre un 0x00) et parcoureras ta chaine sur 3 éléments. Tu afficheras 'AA?' Ce qui en soit n'est pas tres génant. (? représentant un caractère quelconque, souvent non affiché à l'écran).

    La ou cela peut devenir plus génant, c'est si tu modifiais ta chaine. Supposons que tu veuilles que toute ta chaine soit remplacée par des 'B'. Voici ce que tu obtiendrais : 0x65 0x65 0x00 deviendrait 0x66 0x66 0x66. Et la oh surprise, tu n'as plus de fin de chaine.
    que donnerais un strlen de ta chaine ? ni 2, ni 3, mais un nombre quelconque, car rien ne te garantie que tu auras un 0x00 juste apres. Tu peux meme ne jamais en avoir si tu as pas de chance Et ce genre de truc peut devenir une faille de sécurité (appellée buffer overflow) si certaines conditions se présentent.

    Donc toujours faire tres tres attention lors de la manipulation de chaine en C.


    Par ailleurs, j'ai l'impression que tu fais un mix de C et C++.
    En C++ pur, on n'utilise pas les chaines comme cela (strlen d'un tableau de char), on utilise la méthode len() (pas sur du nom) de la classe string, soit un truc du genre (chaine.len())
    The only limiting factor of the Linux operating system, is his user. - Linus Torvalds

Discussions similaires

  1. bug de mon pc
    Par ptitpoint dans le forum Logiciel - Software - Open Source
    Réponses: 3
    Dernier message: 16/08/2009, 13h09
  2. [Blanc] lave vaisselle miele 640 : cuve pleine en fin de programme
    Par dbo75 dans le forum Dépannage
    Réponses: 1
    Dernier message: 19/05/2008, 11h14
  3. [Blanc] LV Bosch logixx bruit après fin de programme
    Par michelb2 dans le forum Dépannage
    Réponses: 6
    Dernier message: 16/09/2007, 14h40
  4. [C]programme graphique qui Bug
    Par invitee17aeca5 dans le forum Logiciel - Software - Open Source
    Réponses: 8
    Dernier message: 09/11/2006, 07h48
  5. Bug Sur Mon Mp3
    Par invitea633795c dans le forum Matériel - Hardware
    Réponses: 3
    Dernier message: 14/05/2006, 16h58
Découvrez nos comparatifs produits sur l'informatique et les technologies.