[Question de Debutant] Caractere de fin de chaine et signe 0
Le
Jo
Salut a tous,
Je m'initie a ce fabuleux langage qu'a l'air d'etre le C++.
Pour l'instant, je lis le bouquin (Le tout en poche : Le Langage C++) avant
de passer a la pratique.
Dans le chapitre traitant des chaines de caracteres, j'ai lu que la fin de
chaine etait marquee par le "signe de fin de chaine".
Celui-ci est defini par "/0" ou "0".
Bon, jusque la, ok.
Mais si je veux mettre un 0 dans ma chaine sans indiquer la fin de celle ci
?? Je fais comment ??
Le compilateur va l'interpreter comme la fin de la chaine alors que dans ce
cas, je veux juste representer un zero !!!
Y a rien a ce propos dans mon bouquin.
Quelqu'un pourrait il m'eclairer ??
Merci d'avance.
A plus.
--
Jo.
Je m'initie a ce fabuleux langage qu'a l'air d'etre le C++.
Pour l'instant, je lis le bouquin (Le tout en poche : Le Langage C++) avant
de passer a la pratique.
Dans le chapitre traitant des chaines de caracteres, j'ai lu que la fin de
chaine etait marquee par le "signe de fin de chaine".
Celui-ci est defini par "/0" ou "0".
Bon, jusque la, ok.
Mais si je veux mettre un 0 dans ma chaine sans indiquer la fin de celle ci
?? Je fais comment ??
Le compilateur va l'interpreter comme la fin de la chaine alors que dans ce
cas, je veux juste representer un zero !!!
Y a rien a ce propos dans mon bouquin.
Quelqu'un pourrait il m'eclairer ??
Merci d'avance.
A plus.
--
Jo.

Poser une question


Uh ? T'es sûr que tu ne lis pas un livre de C ?
En C++, une chaîne s'écrit std::string, et gère toutes ces subtilités
en interne.
En C, ce n'est pas possible.
En C++, ça ne pose pas de problème, ' ' est un caractère comme les
autres. Il faut par contre faire attention lors de l'accès à des
bibliothèques externes écrites en C.
--
;-)
faire des chaines de caractères de forme char*. Même si ce fut la
première historiquement, en C++ on préfère utiliser std::string, qui
s'occupe de gérer tout seul (et donc sans erreurs) la mémoire. Et qui en
plus peut contenir des ' ' sans problèmes. Je me méfierais très
sérieusement de tout livre qui ne parlerait pas de std::string avant char*.
'0' et ' ' représentent des caractères différents (quand on parle des
caractères pris individuellement, on utilise des ' comme délimiteur, les
" étant réservés aux chaines). Donc pas de problème.
--
Loïc
| Salut a tous,
|
| Je m'initie a ce fabuleux langage qu'a l'air d'etre le C++.
| Pour l'instant, je lis le bouquin (Le tout en poche : Le Langage C++) avant
| de passer a la pratique.
|
| Dans le chapitre traitant des chaines de caracteres, j'ai lu que la fin de
| chaine etait marquee par le "signe de fin de chaine".
| Celui-ci est defini par "/0" ou "0".
|
| Bon, jusque la, ok.
non, ce n'est pas OK. Ma première réaction serait que tu brûles le
bouquin (non ne l'offre pas comme cadeau, même à ton pire ennemi),
La notion de chaîne de caractères, en C, est un peu baroque. Grosso
modo, n'importe quelle suite de caractères se terminant par le
caractère nul (' ') est considérée comme une chaîne de caractères.
C++ a hérité cette notion, pour des raisons de compatibilité. Mais, il
offre mieux (enfin, si tu te contentes de faire des choses simples).
C'est le type de données std::string -- il te faut inclure l'entête
| Mais si je veux mettre un 0 dans ma chaine sans indiquer la fin de celle ci
| ?? Je fais comment ??
tu peux mettre le caractère '0' dans une chaîne. Note aussi que
std::string peut contenir, à l'inverse de ce qui se passe en C, le
caractère ' '.
-- Gaby
Le type d'une chaîne littérale en C++ est toujours char const[]. Si on
parle des choses comme ' ' ou '0', on parle bien des chaînes
littérales. Et tu ne veux pas me dire que tu n'as de chaînes littérales
dans tes programmes.
(Évidemment, en C++, une chaîne littérale sert surtout à
l'initialisation d'un std::string. À moins que ce ne soit le nom d'un
fichier qu'on passe à std::ofstreeam::open.)
D'après son posting, j'ai plutôt l'impression que c'est bien le
caractère '0' qu'il veut avoir. Et ça, ça ne pose aucun problème ni en C
en en C++.
D'après ce qu'il a écrit, le caractère de fin de chaîne, c'est soit
' ', soit '0'. Ce qui est mainfestement faux -- c'est ' ', et
seulement ' '. Je ne peux que supposer qu'il a mal compris son bouquin,
parce que franchement, un bouquin qui dit que la fin de chaîne, c'est le
caractère '0', c'est pire que je ne pourrais imaginer.
En fait, le fait qu'il parle du caractère "0", plutôt que '0', me fait
penser qu'il a un problème de base avec le concept de la représentation
des données. Ce qui est fort compréhensible s'il n'a aucune expérience
dans la programmation, et qu'il commence par un livre du langage C++.
Une explication complète en serait trop longue pour poster ici, mais en
ce qui concerne son problème : les caractères dans une chaîne sont des
entités qu'on appelle des octets, parce qu'ils ont 8 bits.
L'interprétation de ces bits dépend du programme, mais l'interprétation
la plus intuitive, c'est de les considérer comme un nombre binaire de 8
bits, un nombre qui a donc une valeur entre 0 et 255. Quand on les
considère comme des caractères, on utilise un encodage qui affecte un
nombre à chaque caractère : le caractère 'a' a le code 97, par exemple,
et le caractère '0' 48. Or, l'indication de la fin d'une chaîne, c'est
le nombre 0 (qu'on peut écrire ' '), non le caractère '0'. Et le nombre
0 ne correspond à aucun caractère utile dans les encodages courants.
Il faut aussi distinguer entre les caractères et les chaînes. Un
caractère, c'est un seul caractère, donc un seul nombre. En C++, une
littérale de caractère s'écrit 'a', entre des apostrophes. Et c'est bien
une valeur numérique, qui correspond à la valeur numérique du caractère
dans l'encodage « natif ». Une chaîne, en revanche, c'est une suite de
caractères, c-à-d une suite de valeurs numérique. En C++, on l'écrit
"a", entre les guillemets anglo-saxons. Et pour une chaîne de n
caractères, le C++ alloue en fait une suite d'n + 1 caractères, parce
qu'il ajoute automatiquement un caractère de valeur numérique 0 à la
fin. Ce qui évite d'avoir à gerer la longueur.
Mais comme a dit Fabien, en C++, on préfère utiliser les chaînes
élaborées, dont le nom du type est std::string. Ces chaînes gèrent de
façon intelligent et la mémoire et leur longueur -- la valeur 0 n'a
aucune signification particulière dans une telle chaîne. On peut les
construite à partir des chaînes littérales, ainsi :
std::string chaine_1( "mon texte" ) ;
mais dans ce cas-là, la zéro marque bien la fin de la chaîne littérale ;
il ne ferait pas partie de la chaîne chaine_1, et on ne peut pas lui
passer une chaîne d'initialisation qui contient un 0. Il y a d'autres
façons à construire une telle chaîne, qui permet bien de créer une
chaîne avec une valeur 0 au milieu. Mais ce n'est pas très utile -- la
preuve, c'est que l'implémentation de ce type dans VC++ 5.0 et 6.0 avait
un boggue qui faisait qu'elle ne marchait pas si la chaîne contenait un
0, et ça n'a apparamment gené personne.
Pas tout à fait. Quand je construis un std::string à partir d'une
littérale de chaîne, par exemple, ce n'est pas le cas.
--
James Kanze GABI Software http://www.gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Tu confonds : il y a une différence entre le caractère et le terminateur.
Si je veux afficher la valeur : 201 sur un ecran, je peux ( en autre ) faire
:
{
....
char Texte [] = { '2', '0', '1', ' ' } ;
printf ( "%s", Texte ) ;
....
}
En fait, le caractere Texte [1], et le caractère Texte [3], sont deux
valeurs complètement différentes.
Tu peux le constater en faisant :
printf ( "caractere =%d separateur=%d", Texte [1], Texte [3] ) ;