Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[Question de Debutant] Caractere de fin de chaine et signe 0

11 réponses
Avatar
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.

10 réponses

1 2
Avatar
Fabien LE LEZ
On Fri, 24 Sep 2004 00:26:18 +0200, "Jo"
:

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".


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.

Mais si je veux mettre un 0 dans ma chaine sans indiquer la fin de celle ci
?


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.



--
;-)

Avatar
Loïc Joly
Jo wrote:
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".
Visiblement, à ce que tu nous dit, ce chapitre parle de la façon de

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*.

Celui-ci est defini par "/0" ou "0".


'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

Avatar
Gabriel Dos Reis
"Jo" writes:

| 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
<string> (et non <string.h>) pour l'avoir. Google un peu la dessus.

| 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
Avatar
kanze
Fabien LE LEZ wrote in message
news:...
On Fri, 24 Sep 2004 00:26:18 +0200, "Jo"
:

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".


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.


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.)

Mais si je veux mettre un 0 dans ma chaine sans indiquer la fin de
celle ci ?


En C, ce n'est pas possible.


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.

En C++, ça ne pose pas de problème, '' est un caractère comme les
autres.


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.

Il faut par contre faire attention lors de l'accès à des bibliothèques
externes écrites en C.


--
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


Avatar
K. Ahausse
"Jo" a écrit dans le message de
news:civikb$j0g$
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.



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] ) ;

Avatar
Matthieu Moy
"K. Ahausse" writes:

char Texte [] = { '2', '0', '1', '' } ;


Qui est équivalent à

char Texte [] = { '2', '0', '1', 0 } ;
^^^

histoire de remuer encore un peu le couteau dans la plaie ;-)

--
Matthieu

Avatar
James Kanze
Matthieu Moy writes:

|> "K. Ahausse" writes:

|> > char Texte [] = { '2', '0', '1', '' } ;

|> Qui est équivalent à

|> char Texte [] = { '2', '0', '1', 0 } ;

Ce qui vaut (sur ma machine) :

char Texte[] = { 50, 48, 49, 0 } ;

Mais évidemment, si j'écrivais le programme, moi, j'écrirais :

char Texte[] = "201" ;

|> histoire de remuer encore un peu le couteau dans la plaie ;-)

Maintenant qu'il est complètement confu:-).

--
James Kanze
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
Avatar
Jo
Salut,

Merci a tous pour vos reponses.

Pas d'inquietude, j'ai compris que les possibilites de simplification sont
nombreuses.
Je suis debutant mais ca va, je suis pas tant a la rue que ca ;)

Bon, ok, on peut mettre un zero (caractere 0) dasn une chaine de caracteres.
Ce qui me gene, c'est que dans le bouquin (bon, c'est certainement pas le
meilleur, mais bon, pour commencer, c'est peut etre pas si mal... en plus
j'ai pas encore lu tout sur tout) il est indique qu'on peut aussi bien
utiliser /0 que 0 comme signe de fin de chaine.
Donc, ok, il y a un fonction std::string qui a l'air bien plus pratique et
puissante a utiliser.
Mais en utilisant la notation "plus classique" qui est Tableau[], si je met
un 0, d'apres le bouquin, au meme titre que /0, ca devrait etre considere
comme la fin de la chaine...
Est ce une erreur du bouquin ??? Ou sinon, comment le compilateur fait il la
difference entre le zero en tant que caractere et le zero de fin de chaine
??
Si je rentre les chaines "annee 2004/0" ou "annee 20040", est ce que dans
les 2 cas, apres une demande d'affichage (bien sur),
j'ai a l'ecran: annee 2004
ou alors j'ai: annee 2 (puisque le 0 indique la fin de la chaine) ???

Merci pour votre aide en tous cas.

A plus.

Jo.
Avatar
Anthony Fleury
Jo wrote:

Salut,


Salut,

Pas d'inquietude, j'ai compris que les possibilites de simplification sont
nombreuses.
Je suis debutant mais ca va, je suis pas tant a la rue que ca ;)


Je crois en fait que tu confonds un peu tout et que le bouquin n'est pas
fait pour les débutants, ils considèrent un savoir en C.

Bon, ok, on peut mettre un zero (caractere 0) dasn une chaine de
caracteres. Ce qui me gene, c'est que dans le bouquin (bon, c'est
certainement pas le meilleur, mais bon, pour commencer, c'est peut etre
pas si mal... en plus j'ai pas encore lu tout sur tout) il est indique
qu'on peut aussi bien utiliser /0 que 0 comme signe de fin de chaine.


Alors déjà ton /0 n'a pas de sens, la fin de chaine classique, en C, c'est
le caractère ''. En fait, pour faire un peu simple, un caractère c'est
une valeur entière, et la correspondance avec un vrai caractère est donné
par le jeu de caractère utilisé.
Le caractère '' dont te parle le livre est la valeur 0 qui décrit un
caractère mais ca ne représente pas le chiffre '0'. Ce chiffre 0 est
représenté par la valeur 48 en décimal lorsque tu es dans le jeu de
caractère ASCII. voir par exemple :
http://www.purebasic.com/french/documentation/Reference/ascii.html

Il te donne deux lignes interessantes :
ASCII Lettre
0 NUL
48 0

Le premier c'est le '' de ton livre, qui est le caractère qu'ils appellent
NUL, et le second et le vrai 0 que tu as dans 2004 et qui a pour code 48.

Donc, ok, il y a un fonction std::string qui a l'air bien plus pratique et
puissante a utiliser.


C'est pas une fonction mais une classe qui permet une utilisation plus
simple des chaines de caractères.

Mais en utilisant la notation "plus classique" qui est Tableau[], si je
met un 0, d'apres le bouquin, au meme titre que /0, ca devrait etre
considere comme la fin de la chaine...


NON NON et NON. '' et le caractère 0 sont différents. En fait si tu mets
la valeur 0 c'est bon, si tu mets le caractère '0' c'est pas une fin de
chaine.

Pour information, ton bouquin ne le dit peut être pas, mais prenons
l'exemple d'un caractère tout simple :

char c;

si tu fais : c = 0;
tu vas mettre la valeur 0 dans C, qui représente le caractère de fin de
chaine ''. Ce caractère n'est pas dans les caractères imprimable.

Si tu veux mettre un 0 pour afficher un 0 comme dans 2004 que tu cites plus
bas, tu dois faire :

c = '0';

Là tu mets '0' dans c, et '0' est la valeur qui représente le caractère 0
dans le code que tu utilises pour représenter les caractères.

Est ce une erreur du bouquin ??? Ou sinon, comment le compilateur fait il
la difference entre le zero en tant que caractere et le zero de fin de
chaine ??
Si je rentre les chaines "annee 2004/0" ou "annee 20040", est ce que dans
les 2 cas, apres une demande d'affichage (bien sur),
j'ai a l'ecran: annee 2004
ou alors j'ai: annee 2 (puisque le 0 indique la fin de la chaine) ???


Voir plus haut, c'est un exemple concret de ce que je disais. Si ton bouquin
ne donne pas d'explication la dessus et balance des chaines comme ca,
change le il ne vaut rien.
En fait ce que ca veut dire c'est que si tu fais ca :

std::cout << "année 2004"; ca va bien t'imprimer sur ton écran (enfin sur la
sortie standard) année 2004.
Si tu fais ca :
std::cout << "année 20040"; ca va imprimer "année 20040".

Mais ce qu'il faut que tu saches, c'est que la taille réelle de "année 2004"
n'est pas celle que tu penses.
En effet, pour savoir où est la fin de la chaine, il faut faire une marque
dans ta chaine, et cette marque c'est cet ''. Donc ta chaine "année
2004" se décompose ainsi : [tu imagines que chaque caractère est dans une
case mémoire et que deux cases mémoires sont séparés par une virgule]

'a','n','n','é','e',' ','2','0','0','4',''.

Elle ne se compose donc pas de 10 caractères mais de 11 caractères vu qu'un
caractère '' a été ajouté pour finir la chaine.

Quand tu écris "année 2004" entre " ", ce caractère est implicite.
Et donc il n'est pas à confondre avec le 0 de 2004 il n'a *RIEN* à voir.

Cependant, un livre de C++ qui attaque directement sur ces notions est bon à
utiliser comme support pour se grandir quand on est trop petit, mais pas à
apprendre correctement le langage.
Tout ceci n'est *PAS* un truc de débutant, ca implique d'avoir des notions
sur les pointeurs, les tableaux et autre.

Si tu veux un conseil, prends un meilleur livre, qui t'introduira les
notions dans l'ordre, il y a pleins de références dans la FAQ
Anthony
--
Alan Turing thought about criteria to settle the question of whether
machines can think, a question of which we now know that it is about as
relevant as the question of whether submarines can swim.
-- Dijkstra

Avatar
James Kanze
"Jo" writes:

|> Bon, ok, on peut mettre un zero (caractere 0) dasn une chaine de
|> caracteres. Ce qui me gene, c'est que dans le bouquin (bon, c'est
|> certainement pas le meilleur, mais bon, pour commencer, c'est peut
|> etre pas si mal... en plus j'ai pas encore lu tout sur tout) il est
|> indique qu'on peut aussi bien utiliser /0 que 0 comme signe de fin
|> de chaine.

Dans quel contexte ? Si j'écris :

char texte[] = { 'a', 'b', 'c', 0 } ;

je peux bien écrire soit 0 soit ''. (La suite de caractères est
illégal en dehor d'une chaîne ou d'une constante de caractère. Et si /0
n'est pas un typo de ta part pour , alors, il faut vraiment jeter le
livre. Mais ça serait vraiment trop gros.)

Mais en fait, je n'écris normalement jamais le 0, parce que le
compilateur l'ajoute automatiquement à la fin de chaque chaîne
constante. Ce que je peux écrire, c'est quelque chose du genre :

while ( *p != '' ) ...

Alors, dans ce cas-là, 0 vaut aussi bien que ''. Pour le compilateur ;
pour celui qui lit ton code, je préfère de loin ''.

Note aussi qu'en C++, '' et 0 n'ont pas les mêmes types. Dans beaucoup
d'utilisations (comme dans le while, ci-dessus), ça ne fait aucune
différence. Mais beaucoup ne veut pas dire toutes, et c'est assez facile
d'écrire des bouts de code où il y a bien une différence.

|> Donc, ok, il y a un fonction std::string qui a l'air bien plus
|> pratique et puissante a utiliser.

|> Mais en utilisant la notation "plus classique" qui est Tableau[], si
|> je met un 0, d'apres le bouquin, au meme titre que /0, ca devrait
|> etre considere comme la fin de la chaine...

Je ne suis pas sûr ce que tu entends par « plus classique ». Je fais du
C++ depuis quinze ans, et je ne me suis jamais servi des char[] pour des
chaînes de caractères. Si le compilateur n'était pas livré avec une
classe de string (jamais le cas aujourd'hui), la toute première chose
que j'ai fait était d'y porter la mienne.

Pareil d'ailleurs pour les tableaux en général -- Type[] n'existe pas
dans mon code.`

|> Est ce une erreur du bouquin ??? Ou sinon, comment le compilateur
|> fait il la difference entre le zero en tant que caractere et le zero
|> de fin de chaine ??

Dans une chaîne ou dans une constante de caractère, '0' est le caractère
chiffre 0. Ailleurs, c'est une constante entière (type int) avec la
valeur 0.

|> Si je rentre les chaines "annee 2004/0" ou "annee 20040", est ce que
|> dans les 2 cas, apres une demande d'affichage (bien sur),
|> j'ai a l'ecran: annee 2004
|> ou alors j'ai: annee 2 (puisque le 0 indique la fin de la chaine) ???

As-tu essayé ? Si tu entres la chaîne "année 2004", c'est
effectivement pareil à "année 2004". Dans les deux cas, le compilateur
ajoute un '' à la fin ; dans le premier cas, ça fait deux '', mais
normalement, on s'arrête au premier.

L'exception, évidemment, c'est les cas où tu précises la longueur aussi.
Par exemple :

std::string s1( "année 2004", 12 ) ;

Tu crées une chaîne qui a réelement douze caractères, dont deux
caractères '' à la fin.

--
James Kanze
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
1 2