[debutant]difference entre guillemets et apostrophes
20 réponses
Guillaume R.
Bonjour,
Voila je suis en train d'apprendre le C en utilisant le K&R
comme base.
Mon probleme est le suivant: lors de l'exo 1.10 ou il est
demande de remplacer les tabulations par \t les caracteres
de retour en arriere par \b et les backslashes par \ .
J'arrive sans probleme a ecrire le code mais ce que je ne
comprends pas c'est la raison pour laquelle lorsque j'ecris
if (c=='\t'){
putchar ("\t");
}
mon code ne marche pas (j'ai un @ lors de la saisie).
Par contre si j'ecris:
if (c=='\t'){
putchar ('\t');
}
ca marche sans probleme...Mais je ne comprends pas pourquoi.
Il est ecrit que les apostrophes represente des constantes
caracteres, je m'attendais donc dans le second cas a avoir une
simple tabulation et dans le premier l'affichage de \t
Qq'un pourrait il m'expliquer pourquoi cela fonctionne dans le
second cas et pas dans le premier?
Merci et dsl pour le caractere basique de la question
Je ne pense pas que ça suffira. Ou alors, pour faire dans le festif jovial: putchar ("t"[0]);
Le festif jovial, ca serait plutôt: putchar (0["t"]); (autorisé par la norme :p)
Guillaume R.
Le 02-07-2006, Emmanuel Delahaye a écrit :
Parce que pour indiquer une caractère seul, on utilise ' ' et non " ". Les " " servent à autre chose que tu verras plus tard.
putchar ('t'); Oui je ne comprenais pas pourquoi mais en fait en regardant la page de
man de putchar, j'ai vu que le prototype en était:
int putchar(int car);
j'ai donc compris pourquoi il me fallait mettre une constante caractère au vue de ce que disait ensuite le K&R sur ces constantes.
Pour M. Maurette: voici le warning que j'avais avec puts et aussi avec putchar sous gcc 3.4.4:
Warning: passing arg 1 of `putc' makes integer from pointer without a cast
Pourriez vous m'indiquer quel est ce compilateur bc dont vous parliez? Car je n'ai rien trouvé, sinon un petit outil faisant du calcul multi-précision(je crois!), portant ce nom.. (ici:http://www.gnu.org/software/bc/) Merci à vous tous en tout les cas :)
Le 02-07-2006, Emmanuel Delahaye <emdel@YOURBRAnoos.fr> a écrit :
Parce que pour indiquer une caractère seul, on utilise ' ' et non " ".
Les " " servent à autre chose que tu verras plus tard.
putchar ('t');
Oui je ne comprenais pas pourquoi mais en fait en regardant la page de
man de putchar, j'ai vu que le prototype en était:
int
putchar(int car);
j'ai donc compris pourquoi il me fallait mettre une constante caractère
au vue de ce que disait ensuite le K&R sur ces constantes.
Pour M. Maurette: voici le warning que j'avais avec puts et aussi avec
putchar sous gcc 3.4.4:
Warning: passing arg 1 of `putc' makes integer from pointer without a cast
Pourriez vous m'indiquer quel est ce compilateur bc dont vous parliez?
Car je n'ai rien trouvé, sinon un petit outil faisant du calcul
multi-précision(je crois!), portant ce nom..
(ici:http://www.gnu.org/software/bc/)
Merci à vous tous en tout les cas :)
Parce que pour indiquer une caractère seul, on utilise ' ' et non " ". Les " " servent à autre chose que tu verras plus tard.
putchar ('t'); Oui je ne comprenais pas pourquoi mais en fait en regardant la page de
man de putchar, j'ai vu que le prototype en était:
int putchar(int car);
j'ai donc compris pourquoi il me fallait mettre une constante caractère au vue de ce que disait ensuite le K&R sur ces constantes.
Pour M. Maurette: voici le warning que j'avais avec puts et aussi avec putchar sous gcc 3.4.4:
Warning: passing arg 1 of `putc' makes integer from pointer without a cast
Pourriez vous m'indiquer quel est ce compilateur bc dont vous parliez? Car je n'ai rien trouvé, sinon un petit outil faisant du calcul multi-précision(je crois!), portant ce nom.. (ici:http://www.gnu.org/software/bc/) Merci à vous tous en tout les cas :)
Pierre Maurette
Le 02-07-2006, Emmanuel Delahaye a écrit :
Parce que pour indiquer une caractère seul, on utilise ' ' et non " ". Les " " servent à autre chose que tu verras plus tard.
putchar ('t'); Oui je ne comprenais pas pourquoi mais en fait en regardant la page de
man de putchar, j'ai vu que le prototype en était:
int putchar(int car);
j'ai donc compris pourquoi il me fallait mettre une constante caractère au vue de ce que disait ensuite le K&R sur ces constantes.
Pas spécialement une constante.
Pour M. Maurette: voici le warning que j'avais avec puts et aussi avec putchar sous gcc 3.4.4:
Warning: passing arg 1 of `putc' makes integer from pointer without a cast
J'avais le même. C'est un warning grave.
Pourriez vous m'indiquer quel est ce compilateur bc dont vous parliez? Car je n'ai rien trouvé, sinon un petit outil faisant du calcul multi-précision(je crois!), portant ce nom.. (ici:http://www.gnu.org/software/bc/)
Un compilateur gratuit sous Windows, proposé par Borland. Ne présente plus grand intérêt à cause du fait qu'il n'évolue plus (pour l'instant ?) et des concurrences Windows et gcc. http://www.borland.com/downloads/download_cbuilder.html gcc très bien AMHA pour suivre un cours sur bouquin.
-- Pierre Maurette
Le 02-07-2006, Emmanuel Delahaye <emdel@YOURBRAnoos.fr> a écrit :
Parce que pour indiquer une caractère seul, on utilise ' ' et non " ".
Les " " servent à autre chose que tu verras plus tard.
putchar ('t');
Oui je ne comprenais pas pourquoi mais en fait en regardant la page de
man de putchar, j'ai vu que le prototype en était:
int
putchar(int car);
j'ai donc compris pourquoi il me fallait mettre une constante caractère
au vue de ce que disait ensuite le K&R sur ces constantes.
Pas spécialement une constante.
Pour M. Maurette: voici le warning que j'avais avec puts et aussi avec
putchar sous gcc 3.4.4:
Warning: passing arg 1 of `putc' makes integer from pointer without a cast
J'avais le même. C'est un warning grave.
Pourriez vous m'indiquer quel est ce compilateur bc dont vous parliez?
Car je n'ai rien trouvé, sinon un petit outil faisant du calcul
multi-précision(je crois!), portant ce nom..
(ici:http://www.gnu.org/software/bc/)
Un compilateur gratuit sous Windows, proposé par Borland. Ne présente
plus grand intérêt à cause du fait qu'il n'évolue plus (pour l'instant
?) et des concurrences Windows et gcc.
http://www.borland.com/downloads/download_cbuilder.html
gcc très bien AMHA pour suivre un cours sur bouquin.
Parce que pour indiquer une caractère seul, on utilise ' ' et non " ". Les " " servent à autre chose que tu verras plus tard.
putchar ('t'); Oui je ne comprenais pas pourquoi mais en fait en regardant la page de
man de putchar, j'ai vu que le prototype en était:
int putchar(int car);
j'ai donc compris pourquoi il me fallait mettre une constante caractère au vue de ce que disait ensuite le K&R sur ces constantes.
Pas spécialement une constante.
Pour M. Maurette: voici le warning que j'avais avec puts et aussi avec putchar sous gcc 3.4.4:
Warning: passing arg 1 of `putc' makes integer from pointer without a cast
J'avais le même. C'est un warning grave.
Pourriez vous m'indiquer quel est ce compilateur bc dont vous parliez? Car je n'ai rien trouvé, sinon un petit outil faisant du calcul multi-précision(je crois!), portant ce nom.. (ici:http://www.gnu.org/software/bc/)
Un compilateur gratuit sous Windows, proposé par Borland. Ne présente plus grand intérêt à cause du fait qu'il n'évolue plus (pour l'instant ?) et des concurrences Windows et gcc. http://www.borland.com/downloads/download_cbuilder.html gcc très bien AMHA pour suivre un cours sur bouquin.
-- Pierre Maurette
Guillaume R.
Le 03-07-2006, Pierre Maurette a écrit :
Pas spécialement une constante.
Pour M. Maurette: voici le warning que j'avais avec puts et aussi avec putchar sous gcc 3.4.4:
Warning: passing arg 1 of `putc' makes integer from pointer without a cast
J'avais le même. C'est un warning grave. Ah bon? En effet on essaie de passer une valeur qui n'est pas la bonne.
Mais comme ça n'était qu'un warning. En fait c'est qud vous m'avez dit que votre compilateur refusait la compilation que j'ai regardé le man pour comprendre...
Pourriez vous m'indiquer quel est ce compilateur bc dont vous parliez? Car je n'ai rien trouvé, sinon un petit outil faisant du calcul multi-précision(je crois!), portant ce nom.. (ici:http://www.gnu.org/software/bc/)
Un compilateur gratuit sous Windows, proposé par Borland. Ne présente plus grand intérêt à cause du fait qu'il n'évolue plus (pour l'instant ?) et des concurrences Windows et gcc. http://www.borland.com/downloads/download_cbuilder.html gcc très bien AMHA pour suivre un cours sur bouquin. Merci
Le 03-07-2006, Pierre Maurette <maurettepierre@wanadoo.fr> a écrit :
Pas spécialement une constante.
Pour M. Maurette: voici le warning que j'avais avec puts et aussi avec
putchar sous gcc 3.4.4:
Warning: passing arg 1 of `putc' makes integer from pointer without a cast
J'avais le même. C'est un warning grave.
Ah bon? En effet on essaie de passer une valeur qui n'est pas la bonne.
Mais comme ça n'était qu'un warning. En fait c'est qud vous m'avez dit
que votre compilateur refusait la compilation que j'ai regardé le man
pour comprendre...
Pourriez vous m'indiquer quel est ce compilateur bc dont vous parliez?
Car je n'ai rien trouvé, sinon un petit outil faisant du calcul
multi-précision(je crois!), portant ce nom..
(ici:http://www.gnu.org/software/bc/)
Un compilateur gratuit sous Windows, proposé par Borland. Ne présente
plus grand intérêt à cause du fait qu'il n'évolue plus (pour l'instant
?) et des concurrences Windows et gcc.
http://www.borland.com/downloads/download_cbuilder.html
gcc très bien AMHA pour suivre un cours sur bouquin.
Merci
Pour M. Maurette: voici le warning que j'avais avec puts et aussi avec putchar sous gcc 3.4.4:
Warning: passing arg 1 of `putc' makes integer from pointer without a cast
J'avais le même. C'est un warning grave. Ah bon? En effet on essaie de passer une valeur qui n'est pas la bonne.
Mais comme ça n'était qu'un warning. En fait c'est qud vous m'avez dit que votre compilateur refusait la compilation que j'ai regardé le man pour comprendre...
Pourriez vous m'indiquer quel est ce compilateur bc dont vous parliez? Car je n'ai rien trouvé, sinon un petit outil faisant du calcul multi-précision(je crois!), portant ce nom.. (ici:http://www.gnu.org/software/bc/)
Un compilateur gratuit sous Windows, proposé par Borland. Ne présente plus grand intérêt à cause du fait qu'il n'évolue plus (pour l'instant ?) et des concurrences Windows et gcc. http://www.borland.com/downloads/download_cbuilder.html gcc très bien AMHA pour suivre un cours sur bouquin. Merci
H.
Pierre Maurette :
Non, la chaîne "t", c'est {'t', ' '}, c'est à dire une chaîne bien formée (avec zéro final) contanant une tabulation et rien d'autre. Pour afficher t, la chaîne serait "t" (on dit qu'on "échappe" l'antislash).
Question de débutant... encore... Pour t, je comprends, mais pour {'t', ' '}que signifie ce 0 ?
Cordialement, Christophe
Pierre Maurette :
Non, la chaîne "t", c'est {'t', ' '}, c'est à dire une chaîne bien
formée (avec zéro final) contanant une tabulation et rien d'autre. Pour
afficher t, la chaîne serait "\t" (on dit qu'on "échappe" l'antislash).
Question de débutant... encore...
Pour \t, je comprends, mais pour {'t', ' '}que signifie ce 0 ?
Non, la chaîne "t", c'est {'t', ' '}, c'est à dire une chaîne bien formée (avec zéro final) contanant une tabulation et rien d'autre. Pour afficher t, la chaîne serait "t" (on dit qu'on "échappe" l'antislash).
Question de débutant... encore... Pour t, je comprends, mais pour {'t', ' '}que signifie ce 0 ?
Cordialement, Christophe
Sylvain
H. wrote on 08/07/2006 16:32:
Question de débutant... encore... Pour t, je comprends, mais pour {'t', ' '}que signifie ce 0 ?
le zero (que l'on note souvent lorsqu'il décrit un caractère) marque la fin de la chaine de caractères.
un caractère est simplement une case mémoire (généralement d'1 octet) qui contient le code de ce caractère, par ex.
char c = 'A'; équivalent à char c = 0x41;
une chaine de caractères est un pointeur (de 4 ou 8 octets) qui contient l'adresse d'un tableau de caractères.
static char* str = "titi";
le compilo a ici réservé 5 octets { 't','i','t','i',' ' } quelque part en mémoire, il a ajouté un et a stocké cette adresse dans le pointeur 'str'.
pourquoi ce ' ' ? parce que lorsque l'on utilise une chaine, on a invariablement besoin de connaitre sa longeur (pour ne pas parcourir bêtement toute la RAM), en Pascal on code explicitement cette longueur dans le premier caractères de la chaine (str[0] est la longueur) avec une limitation des chaines à 255 caractères; en C cette longueur n'est pas explicite (donc pas contrainte en taille; une chaine de dizaines ou centaines de Ko, Mo, reste une chaine), la chaine finit seulement sur ce ' ' dit terminal (d'un point de vue logique évidemment; la taille réelle du tableau alloué ou réservé n'est pas lié à l'emplacement de ce marqueur).
Sylvain.
H. wrote on 08/07/2006 16:32:
Question de débutant... encore...
Pour \t, je comprends, mais pour {'t', ' '}que signifie ce 0 ?
le zero (que l'on note souvent lorsqu'il décrit un caractère) marque
la fin de la chaine de caractères.
un caractère est simplement une case mémoire (généralement d'1 octet)
qui contient le code de ce caractère, par ex.
char c = 'A'; équivalent à char c = 0x41;
une chaine de caractères est un pointeur (de 4 ou 8 octets) qui contient
l'adresse d'un tableau de caractères.
static char* str = "titi";
le compilo a ici réservé 5 octets { 't','i','t','i',' ' } quelque part
en mémoire, il a ajouté un et a stocké cette adresse dans le pointeur
'str'.
pourquoi ce ' ' ? parce que lorsque l'on utilise une chaine, on a
invariablement besoin de connaitre sa longeur (pour ne pas parcourir
bêtement toute la RAM), en Pascal on code explicitement cette longueur
dans le premier caractères de la chaine (str[0] est la longueur) avec
une limitation des chaines à 255 caractères; en C cette longueur n'est
pas explicite (donc pas contrainte en taille; une chaine de dizaines ou
centaines de Ko, Mo, reste une chaine), la chaine finit seulement sur ce
' ' dit terminal (d'un point de vue logique évidemment; la taille
réelle du tableau alloué ou réservé n'est pas lié à l'emplacement de ce
marqueur).
Question de débutant... encore... Pour t, je comprends, mais pour {'t', ' '}que signifie ce 0 ?
le zero (que l'on note souvent lorsqu'il décrit un caractère) marque la fin de la chaine de caractères.
un caractère est simplement une case mémoire (généralement d'1 octet) qui contient le code de ce caractère, par ex.
char c = 'A'; équivalent à char c = 0x41;
une chaine de caractères est un pointeur (de 4 ou 8 octets) qui contient l'adresse d'un tableau de caractères.
static char* str = "titi";
le compilo a ici réservé 5 octets { 't','i','t','i',' ' } quelque part en mémoire, il a ajouté un et a stocké cette adresse dans le pointeur 'str'.
pourquoi ce ' ' ? parce que lorsque l'on utilise une chaine, on a invariablement besoin de connaitre sa longeur (pour ne pas parcourir bêtement toute la RAM), en Pascal on code explicitement cette longueur dans le premier caractères de la chaine (str[0] est la longueur) avec une limitation des chaines à 255 caractères; en C cette longueur n'est pas explicite (donc pas contrainte en taille; une chaine de dizaines ou centaines de Ko, Mo, reste une chaine), la chaine finit seulement sur ce ' ' dit terminal (d'un point de vue logique évidemment; la taille réelle du tableau alloué ou réservé n'est pas lié à l'emplacement de ce marqueur).
Sylvain.
H.
Merci...
(C'est étrange, mais c'est avec une question précise sur le langage que je comprends le mieux comment il tourne... Je dis ça parce qu'il semble que vous suivez l'autre fil... Bref.) Déjà, ça me rassure, parce qu'il existe bien un type STRING OF CHAR, qu'on peut manipuler de manière pas trop compliquée... Bon. Pour le reste, c'est bon. Mais ma question devient à présent : est-il vraiment compliqué de gérer des types STRING en C++ (ou en C) ? Et faire des tableaux de STRING, et enregistrer ces tableaux dans des fichiers avec, comme vous le faisiez remarquer dans un autre fil, fread/fwrite(data, 100, 5, source/dest); ? Bon, déjà, là, je crois qu'avec STRING, on n'est plus dans votre définition de données basique...
Amicalement, Christophe
P.S. : VAR CHAINE : STRING; oui, le bon temps ^^ dommage qu'avec Turbo Pascal, on ne fasse pas d'appli graphiques, sinon ce serait déjà problème résolu...
Merci...
(C'est étrange, mais c'est avec une question précise sur le langage que
je comprends le mieux comment il tourne... Je dis ça parce qu'il semble que
vous suivez l'autre fil... Bref.)
Déjà, ça me rassure, parce qu'il existe bien un type STRING OF CHAR,
qu'on peut manipuler de manière pas trop compliquée... Bon. Pour le reste,
c'est bon. Mais ma question devient à présent : est-il vraiment compliqué de
gérer des types STRING en C++ (ou en C) ? Et faire des tableaux de STRING,
et enregistrer ces tableaux dans des fichiers avec, comme vous le faisiez
remarquer dans un autre fil, fread/fwrite(data, 100, 5, source/dest); ?
Bon, déjà, là, je crois qu'avec STRING, on n'est plus dans votre
définition de données basique...
Amicalement,
Christophe
P.S. : VAR CHAINE : STRING; oui, le bon temps ^^ dommage qu'avec Turbo
Pascal, on ne fasse pas d'appli graphiques, sinon ce serait déjà problème
résolu...
(C'est étrange, mais c'est avec une question précise sur le langage que je comprends le mieux comment il tourne... Je dis ça parce qu'il semble que vous suivez l'autre fil... Bref.) Déjà, ça me rassure, parce qu'il existe bien un type STRING OF CHAR, qu'on peut manipuler de manière pas trop compliquée... Bon. Pour le reste, c'est bon. Mais ma question devient à présent : est-il vraiment compliqué de gérer des types STRING en C++ (ou en C) ? Et faire des tableaux de STRING, et enregistrer ces tableaux dans des fichiers avec, comme vous le faisiez remarquer dans un autre fil, fread/fwrite(data, 100, 5, source/dest); ? Bon, déjà, là, je crois qu'avec STRING, on n'est plus dans votre définition de données basique...
Amicalement, Christophe
P.S. : VAR CHAINE : STRING; oui, le bon temps ^^ dommage qu'avec Turbo Pascal, on ne fasse pas d'appli graphiques, sinon ce serait déjà problème résolu...
Sylvain
H. wrote on 08/07/2006 19:33:
Déjà, ça me rassure, parce qu'il existe bien un type STRING OF CHAR,
non, ce n'est pas ce que j'ai dit, j'ai dit que le concept (humainement perçu) de chaine de caractères était réalisé via des tableaux de caractères.
poursuivons les comparaisons, en TP on faisait:
String str; -- et cela réservait 1 + 255 octets sans que l'on se soucie de rien puis: str := "titi"; -- et cela stockait dans le tableau de str les 4 caractères titi tout en ajustant la longueur (str[0] := 4;).
en C (pur sucre) rien de tout cela, vous définissez une chaine (en fait une variable dont la vocation _sera_ de contenir une chaine) par:
char* str;
et cela ne fait rien d'autre que de réserver 4 (ou 8) octets pour le pointeur; si vous écrivez dans l'adresse (aléatoire) pointée par cette variable, ça peut faire boum, si vous lisez le contenu pointé vous obtenez soit n'importe quoi soit une violation d'acces.
donc tout commencera par une allocation:
str = (char*) malloc(theStrLength);
(où theStrLength est le nb de caractères à stocker + 1 pour le fameux terminal).
on pourra de plus remplir toute cette chaine avec des zéros, comme ça le zéro terminal sera bien présent dès le premier car. (c'est une mauvaise explication de la raison mais c'est utile pour nombre d'API).
memset(str, 0, theStrLength);
vient alors l'affectation, on pourrait naivement faire:
str = "titi";
mais erreur; une telle chaine constante est (on l'a dit) un tableau créé par le compilo et stocké qlq part, donc ici on ne fait que perdre l'adresse du tableau alloué par malloc et stocker l'adresse de la constante "titi " à sa place.
en fait si on a reçu une chaine (en parsant un input file ou une réponse SQL) on manipule un pointeur contenant le premier caractère de cette chaine, on voudra alors copier le contenu de ce pointeur (la suite de car. situés à cette adresse) dans le tableau str nous appartenant; soit par exemple (en assumant que aSource est un pointeur sur cette chaine nul terminée et que le contenu de str est bien initialisé à zéro):
strncat(str, aSource, theStrLength);
finalement quand la chaine ne sera plus utile on libérera la mémoire par free(str);
on peut le deviner avec ces exemples, ici C++ marque un point avec une définition standard: std::string qui permettra elle:
néanmois, le header string.h regeorge de fonctions de manipulations de chaines et, passées leurs études, on peut les utiliser sans perception de contraintes et/ou se faire ses fonctions raccourcis.
et enregistrer ces tableaux dans des fichiers avec, comme vous le faisiez remarquer dans un autre fil, fread/fwrite(data, 100, 5, source/dest); ?
là encore, les fonctions C vous permettent de tout faire (en étant attentif à son code) soit par exemple:
fputs(str, aFileOpenedInWriteStringMode);
ou encore (en faisant le choix d'écrire le zéro terminal)
en C++ on utilisera plus volontiers une classe toute faite, utilisant la même cuisine en interne, mais offrant des accès simplifiés, par exemple un opérateur d'injection:
aFile << str;
pour recouper l'autre fil, vous pouvez coder en C le squelette de votre appli et faire du C++ (presque sans le savoir) pour implémenter certaines parties s'accomodant de std::string et autres streams.
Sylvain.
H. wrote on 08/07/2006 19:33:
Déjà, ça me rassure, parce qu'il existe bien un type STRING OF CHAR,
non, ce n'est pas ce que j'ai dit, j'ai dit que le concept (humainement
perçu) de chaine de caractères était réalisé via des tableaux de caractères.
poursuivons les comparaisons, en TP on faisait:
String str; -- et cela réservait 1 + 255 octets sans que l'on se soucie
de rien
puis: str := "titi"; -- et cela stockait dans le tableau de str les 4
caractères titi tout en ajustant la longueur (str[0] := 4;).
en C (pur sucre) rien de tout cela, vous définissez une chaine (en fait
une variable dont la vocation _sera_ de contenir une chaine) par:
char* str;
et cela ne fait rien d'autre que de réserver 4 (ou 8) octets pour le
pointeur; si vous écrivez dans l'adresse (aléatoire) pointée par cette
variable, ça peut faire boum, si vous lisez le contenu pointé vous
obtenez soit n'importe quoi soit une violation d'acces.
donc tout commencera par une allocation:
str = (char*) malloc(theStrLength);
(où theStrLength est le nb de caractères à stocker + 1 pour le fameux
terminal).
on pourra de plus remplir toute cette chaine avec des zéros, comme ça le
zéro terminal sera bien présent dès le premier car. (c'est une mauvaise
explication de la raison mais c'est utile pour nombre d'API).
memset(str, 0, theStrLength);
vient alors l'affectation, on pourrait naivement faire:
str = "titi";
mais erreur; une telle chaine constante est (on l'a dit) un tableau créé
par le compilo et stocké qlq part, donc ici on ne fait que perdre
l'adresse du tableau alloué par malloc et stocker l'adresse de la
constante "titi " à sa place.
en fait si on a reçu une chaine (en parsant un input file ou une réponse
SQL) on manipule un pointeur contenant le premier caractère de cette
chaine, on voudra alors copier le contenu de ce pointeur (la suite de
car. situés à cette adresse) dans le tableau str nous appartenant; soit
par exemple (en assumant que aSource est un pointeur sur cette chaine
nul terminée et que le contenu de str est bien initialisé à zéro):
strncat(str, aSource, theStrLength);
finalement quand la chaine ne sera plus utile on libérera la mémoire par
free(str);
on peut le deviner avec ces exemples, ici C++ marque un point avec une
définition standard: std::string qui permettra elle:
néanmois, le header string.h regeorge de fonctions de manipulations de
chaines et, passées leurs études, on peut les utiliser sans perception
de contraintes et/ou se faire ses fonctions raccourcis.
et enregistrer ces tableaux dans des fichiers avec, comme vous le faisiez
remarquer dans un autre fil, fread/fwrite(data, 100, 5, source/dest); ?
là encore, les fonctions C vous permettent de tout faire (en étant
attentif à son code) soit par exemple:
fputs(str, aFileOpenedInWriteStringMode);
ou encore (en faisant le choix d'écrire le zéro terminal)
en C++ on utilisera plus volontiers une classe toute faite, utilisant la
même cuisine en interne, mais offrant des accès simplifiés, par exemple
un opérateur d'injection:
aFile << str;
pour recouper l'autre fil, vous pouvez coder en C le squelette de votre
appli et faire du C++ (presque sans le savoir) pour implémenter
certaines parties s'accomodant de std::string et autres streams.
Déjà, ça me rassure, parce qu'il existe bien un type STRING OF CHAR,
non, ce n'est pas ce que j'ai dit, j'ai dit que le concept (humainement perçu) de chaine de caractères était réalisé via des tableaux de caractères.
poursuivons les comparaisons, en TP on faisait:
String str; -- et cela réservait 1 + 255 octets sans que l'on se soucie de rien puis: str := "titi"; -- et cela stockait dans le tableau de str les 4 caractères titi tout en ajustant la longueur (str[0] := 4;).
en C (pur sucre) rien de tout cela, vous définissez une chaine (en fait une variable dont la vocation _sera_ de contenir une chaine) par:
char* str;
et cela ne fait rien d'autre que de réserver 4 (ou 8) octets pour le pointeur; si vous écrivez dans l'adresse (aléatoire) pointée par cette variable, ça peut faire boum, si vous lisez le contenu pointé vous obtenez soit n'importe quoi soit une violation d'acces.
donc tout commencera par une allocation:
str = (char*) malloc(theStrLength);
(où theStrLength est le nb de caractères à stocker + 1 pour le fameux terminal).
on pourra de plus remplir toute cette chaine avec des zéros, comme ça le zéro terminal sera bien présent dès le premier car. (c'est une mauvaise explication de la raison mais c'est utile pour nombre d'API).
memset(str, 0, theStrLength);
vient alors l'affectation, on pourrait naivement faire:
str = "titi";
mais erreur; une telle chaine constante est (on l'a dit) un tableau créé par le compilo et stocké qlq part, donc ici on ne fait que perdre l'adresse du tableau alloué par malloc et stocker l'adresse de la constante "titi " à sa place.
en fait si on a reçu une chaine (en parsant un input file ou une réponse SQL) on manipule un pointeur contenant le premier caractère de cette chaine, on voudra alors copier le contenu de ce pointeur (la suite de car. situés à cette adresse) dans le tableau str nous appartenant; soit par exemple (en assumant que aSource est un pointeur sur cette chaine nul terminée et que le contenu de str est bien initialisé à zéro):
strncat(str, aSource, theStrLength);
finalement quand la chaine ne sera plus utile on libérera la mémoire par free(str);
on peut le deviner avec ces exemples, ici C++ marque un point avec une définition standard: std::string qui permettra elle:
néanmois, le header string.h regeorge de fonctions de manipulations de chaines et, passées leurs études, on peut les utiliser sans perception de contraintes et/ou se faire ses fonctions raccourcis.
et enregistrer ces tableaux dans des fichiers avec, comme vous le faisiez remarquer dans un autre fil, fread/fwrite(data, 100, 5, source/dest); ?
là encore, les fonctions C vous permettent de tout faire (en étant attentif à son code) soit par exemple:
fputs(str, aFileOpenedInWriteStringMode);
ou encore (en faisant le choix d'écrire le zéro terminal)
en C++ on utilisera plus volontiers une classe toute faite, utilisant la même cuisine en interne, mais offrant des accès simplifiés, par exemple un opérateur d'injection:
aFile << str;
pour recouper l'autre fil, vous pouvez coder en C le squelette de votre appli et faire du C++ (presque sans le savoir) pour implémenter certaines parties s'accomodant de std::string et autres streams.
Sylvain.
Emmanuel Delahaye
Déjà, ça me rassure, parce qu'il existe bien un type STRING OF CHAR,
Non. Le type string est 'virtuel' en C. Il existe dans la définition du langage en tant qu'abstraction, dans le tête du programmeur et dans celle du concepteur de la bibliothèque standard, mais pas dans le langage lui même.
Mais on peut en créer un si nécessaire.
http://mapage.noos.fr/emdel/clib.htm module FSTR
qu'on peut manipuler de manière pas trop compliquée... Bon. Pour le reste, c'est bon. Mais ma question devient à présent : est-il vraiment compliqué de gérer des types STRING en C++ (ou en C) ? Et faire des tableaux de STRING, et enregistrer ces tableaux dans des fichiers avec, comme vous le faisiez remarquer dans un autre fil, fread/fwrite(data, 100, 5, source/dest); ? Bon, déjà, là, je crois qu'avec STRING, on n'est plus dans votre définition de données basique...
C'est pas compliqué, mais il faut être prudent et savoir ce qu'on fait c'est tout.
-- A+
Emmanuel Delahaye
Déjà, ça me rassure, parce qu'il existe bien un type STRING OF CHAR,
Non. Le type string est 'virtuel' en C. Il existe dans la définition du
langage en tant qu'abstraction, dans le tête du programmeur et dans
celle du concepteur de la bibliothèque standard, mais pas dans le
langage lui même.
Mais on peut en créer un si nécessaire.
http://mapage.noos.fr/emdel/clib.htm
module FSTR
qu'on peut manipuler de manière pas trop compliquée... Bon. Pour le reste,
c'est bon. Mais ma question devient à présent : est-il vraiment compliqué de
gérer des types STRING en C++ (ou en C) ? Et faire des tableaux de STRING,
et enregistrer ces tableaux dans des fichiers avec, comme vous le faisiez
remarquer dans un autre fil, fread/fwrite(data, 100, 5, source/dest); ?
Bon, déjà, là, je crois qu'avec STRING, on n'est plus dans votre
définition de données basique...
C'est pas compliqué, mais il faut être prudent et savoir ce qu'on fait
c'est tout.
Déjà, ça me rassure, parce qu'il existe bien un type STRING OF CHAR,
Non. Le type string est 'virtuel' en C. Il existe dans la définition du langage en tant qu'abstraction, dans le tête du programmeur et dans celle du concepteur de la bibliothèque standard, mais pas dans le langage lui même.
Mais on peut en créer un si nécessaire.
http://mapage.noos.fr/emdel/clib.htm module FSTR
qu'on peut manipuler de manière pas trop compliquée... Bon. Pour le reste, c'est bon. Mais ma question devient à présent : est-il vraiment compliqué de gérer des types STRING en C++ (ou en C) ? Et faire des tableaux de STRING, et enregistrer ces tableaux dans des fichiers avec, comme vous le faisiez remarquer dans un autre fil, fread/fwrite(data, 100, 5, source/dest); ? Bon, déjà, là, je crois qu'avec STRING, on n'est plus dans votre définition de données basique...
C'est pas compliqué, mais il faut être prudent et savoir ce qu'on fait c'est tout.