Tout a l'heure, en passant mon programme (le CowSay des exercices de Nanoc) de Linux a Windows je me suis aperçu que le même code source une fois compilé ne s'exécutait pas de la même façon sur les 2 OS...
Il se trouve qu'en rajoutant une ligne, le programme fonctionne de la même façon sur les 2 OS. Ne serai-ce pas a cause du break qui casserais le if au lieu du while? (la variable "compteur" serait alors incrémentée ce qui empêcherait le while de tester le caractère de fin...)
Voici le code Source...
#include <iostream>
#include <string>
using namespace std;
string decoupage(string chaine);
int main()
{
//Petit scénario
cout<<"Une vache qui parle!Vous me croyez pas?"<<endl;
cout<<"Faites lui dire quelque chose:"<<endl;
//On prend la chaine entrée par l'utilisateur
string phraseVache;
getline(cin, phraseVache);
phraseVache += '\0';//<---ligne ajoutée -> bug terminé
//On dessine le haut de la bulle
cout<<" ";
for(long i = 0; i<26; i++)
{
cout<<"_";
}
cout<<endl;
//On écrit sa phrase
cout<<decoupage(phraseVache);
//On dessine le bas de la bulle
cout<<" ";
for(long i = 0; i<26; i++)
{
cout<<"-";
}
cout<<endl;
//Puis la vache
cout<<" \\ |"<<endl;
cout<<" (\\/)"<<endl;
cout<<" (oo)"<<endl;
cout<<" (..)"<<endl;
getchar();
return 0;
}
string decoupage(string chaine)
{
int compteur = 0;
int comDebut=0;
int longeurLigne = 0;
string ligne = "";
string lignes = "";
while(chaine[compteur] != '\0')
{
longeurLigne = 23;
for(int i=0; i<25; i++)
{
if(chaine[compteur] == ' ')
{
longeurLigne = i;
}
if(chaine[compteur] == '\0')
{
longeurLigne = i;
break;//<---------le break incriminé?
}
compteur++;
}
ligne = " ";
for(int j=0; j<=longeurLigne; j++)
{
ligne[j] = chaine[comDebut + j];
}
lignes += "< " + ligne +" >\n";
comDebut += longeurLigne+1;
compteur = comDebut;
}
return lignes;
}
Voila, je trouve tout ça très bizarre, moi... Est-ce vraiment le break ou est ce quelque chose que je n'aurais pas vu?
Il arrête la boucle for (car en cas de boucles imbriquées, break fait sortir de la boucle la plus interne) quand le caractère de fin de chaîne '\0' est trouvé. A priori, son absence sera tolérée par le compilateur dans ce code, mais conduirait à des tours de boucle inutiles.
Les string C++ ne stockent pas le caractère '\0' comme marqueur de fin de chaine, pour la bonne et simple raison qu'elles connaissent leurs tailles, contrairement aux chaines de type C.
C'est pour ça qu'en l'ayant rajouté ton code est devenu fonctionnel.
Tu ne dois pas utiliser le caractère '\0' mais plutôt utiliser length() pour obtenir la longueur de ta chaine, ou travailler avec des itérateurs.
Il arrête la boucle for (car en cas de boucles imbriquées, break fait sortir de la boucle la plus interne) quand le caractère de fin de chaîne '\0' est trouvé. A priori, son absence sera tolérée par le compilateur dans ce code, mais conduirait à des tours de boucle inutiles.
Dans mon esprit, sortir de la boucle for conduirait a arrêter la boucle while : si chaine[compteur] = '\0' -> la condition du while ne serai pas remplie.
Ce que j'ai oublié c'est que la variable compteur changeait a la fin du while... (j'avais po vu ...)
Enfin...Ça explique pas pourquoi sous Linux ça marchais...
Citation : St Untrider
Les string C++ ne stockent pas le caractère '\0' comme marqueur de fin de chaine, pour la bonne et simple raison qu'elles connaissent leurs tailles, contrairement aux chaines de type C.
C'est faux... en ne rajoutant pas le '\0' a la fin de la chaine, le code suivant s'exécute quand même puisque la console affiche "Il y a bien un '\0"...
if(chaine[compteur] == '\0')
{
longeurLigne = i;
cout<<"Il y a bien un '\\0'";
break;
}
Différentes interprétations de "break;"?
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Recueil de code C et C++ http://fvirtman.free.fr/recueil/index.html