In article <473e0559$0$14273$,
Charlie Gordon wrote:m[i] = tolower((unsigned char)m[i]);
Euh, le cast en question, c'est la bibliotheque C qui est censee le
faire en interne... du point de vue utilisateur, tolower() prend
specifiquement un int pour qu'il n'y ait pas de probleme de coercion
du caractere mal venue...
de manière générale, jamais faire de cast explicite là où le cast
implicite fonctionne. C'est la porte ouverte à des conversions invalides
qui peuvent prendre des heures à débugger
In article <473e0559$0$14273$426a74cc@news.free.fr>,
Charlie Gordon <news@chqrlie.org> wrote:
m[i] = tolower((unsigned char)m[i]);
Euh, le cast en question, c'est la bibliotheque C qui est censee le
faire en interne... du point de vue utilisateur, tolower() prend
specifiquement un int pour qu'il n'y ait pas de probleme de coercion
du caractere mal venue...
de manière générale, jamais faire de cast explicite là où le cast
implicite fonctionne. C'est la porte ouverte à des conversions invalides
qui peuvent prendre des heures à débugger
In article <473e0559$0$14273$,
Charlie Gordon wrote:m[i] = tolower((unsigned char)m[i]);
Euh, le cast en question, c'est la bibliotheque C qui est censee le
faire en interne... du point de vue utilisateur, tolower() prend
specifiquement un int pour qu'il n'y ait pas de probleme de coercion
du caractere mal venue...
de manière générale, jamais faire de cast explicite là où le cast
implicite fonctionne. C'est la porte ouverte à des conversions invalides
qui peuvent prendre des heures à débugger
In article <473e0559$0$14273$,
Charlie Gordon wrote:m[i] = tolower((unsigned char)m[i]);
Euh, le cast en question, c'est la bibliotheque C qui est censee le
faire en interne... du point de vue utilisateur, tolower() prend
specifiquement un int pour qu'il n'y ait pas de probleme de coercion
du caractere mal venue...
In article <473e0559$0$14273$426a74cc@news.free.fr>,
Charlie Gordon <news@chqrlie.org> wrote:
m[i] = tolower((unsigned char)m[i]);
Euh, le cast en question, c'est la bibliotheque C qui est censee le
faire en interne... du point de vue utilisateur, tolower() prend
specifiquement un int pour qu'il n'y ait pas de probleme de coercion
du caractere mal venue...
In article <473e0559$0$14273$,
Charlie Gordon wrote:m[i] = tolower((unsigned char)m[i]);
Euh, le cast en question, c'est la bibliotheque C qui est censee le
faire en interne... du point de vue utilisateur, tolower() prend
specifiquement un int pour qu'il n'y ait pas de probleme de coercion
du caractere mal venue...
In article <473e0559$0$14273$,
Charlie Gordon wrote:m[i] = tolower((unsigned char)m[i]);
Euh, le cast en question, c'est la bibliotheque C qui est censee le
faire en interne... du point de vue utilisateur, tolower() prend
specifiquement un int pour qu'il n'y ait pas de probleme de coercion
du caractere mal venue...
In article <473e0559$0$14273$426a74cc@news.free.fr>,
Charlie Gordon <news@chqrlie.org> wrote:
m[i] = tolower((unsigned char)m[i]);
Euh, le cast en question, c'est la bibliotheque C qui est censee le
faire en interne... du point de vue utilisateur, tolower() prend
specifiquement un int pour qu'il n'y ait pas de probleme de coercion
du caractere mal venue...
In article <473e0559$0$14273$,
Charlie Gordon wrote:m[i] = tolower((unsigned char)m[i]);
Euh, le cast en question, c'est la bibliotheque C qui est censee le
faire en interne... du point de vue utilisateur, tolower() prend
specifiquement un int pour qu'il n'y ait pas de probleme de coercion
du caractere mal venue...
In article <473e0559$0$14273$,
Charlie Gordon wrote:m[i] = tolower((unsigned char)m[i]);
Euh, le cast en question, c'est la bibliotheque C qui est censee le
faire en interne... du point de vue utilisateur, tolower() prend
specifiquement un int pour qu'il n'y ait pas de probleme de coercion
du caractere mal venue...
de manière générale, jamais faire de cast explicite là où le cast
implicite fonctionne. C'est la porte ouverte à des conversions invalides
qui peuvent prendre des heures à débugger
In article <473e0559$0$14273$426a74cc@news.free.fr>,
Charlie Gordon <news@chqrlie.org> wrote:
m[i] = tolower((unsigned char)m[i]);
Euh, le cast en question, c'est la bibliotheque C qui est censee le
faire en interne... du point de vue utilisateur, tolower() prend
specifiquement un int pour qu'il n'y ait pas de probleme de coercion
du caractere mal venue...
de manière générale, jamais faire de cast explicite là où le cast
implicite fonctionne. C'est la porte ouverte à des conversions invalides
qui peuvent prendre des heures à débugger
In article <473e0559$0$14273$,
Charlie Gordon wrote:m[i] = tolower((unsigned char)m[i]);
Euh, le cast en question, c'est la bibliotheque C qui est censee le
faire en interne... du point de vue utilisateur, tolower() prend
specifiquement un int pour qu'il n'y ait pas de probleme de coercion
du caractere mal venue...
de manière générale, jamais faire de cast explicite là où le cast
implicite fonctionne. C'est la porte ouverte à des conversions invalides
qui peuvent prendre des heures à débugger
(Marc Espie) writes:In article <473e0559$0$14273$,
Charlie Gordon wrote:m[i] = tolower((unsigned char)m[i]);
Euh, le cast en question, c'est la bibliotheque C qui est censee le
faire en interne... du point de vue utilisateur, tolower() prend
specifiquement un int pour qu'il n'y ait pas de probleme de coercion
du caractere mal venue...
"In all cases the argument is an int, the value of which shall be
representable as an unsigned char or shall equal the value of the macro
EOF."
Si on a un char signé, le passer à tolower etc sans faire un cast en
unsigned char est du comportement indéfini quand la valeur est négative et
différente de EOF (et on a potentiellement un mauvais résultat si la
valeur
est celle d'EOF, ce qui est le cas par exemple dans une locale latin-9
pour
y tréma passé à toupper).
A+
espie@lain.home (Marc Espie) writes:
In article <473e0559$0$14273$426a74cc@news.free.fr>,
Charlie Gordon <news@chqrlie.org> wrote:
m[i] = tolower((unsigned char)m[i]);
Euh, le cast en question, c'est la bibliotheque C qui est censee le
faire en interne... du point de vue utilisateur, tolower() prend
specifiquement un int pour qu'il n'y ait pas de probleme de coercion
du caractere mal venue...
"In all cases the argument is an int, the value of which shall be
representable as an unsigned char or shall equal the value of the macro
EOF."
Si on a un char signé, le passer à tolower etc sans faire un cast en
unsigned char est du comportement indéfini quand la valeur est négative et
différente de EOF (et on a potentiellement un mauvais résultat si la
valeur
est celle d'EOF, ce qui est le cas par exemple dans une locale latin-9
pour
y tréma passé à toupper).
A+
(Marc Espie) writes:In article <473e0559$0$14273$,
Charlie Gordon wrote:m[i] = tolower((unsigned char)m[i]);
Euh, le cast en question, c'est la bibliotheque C qui est censee le
faire en interne... du point de vue utilisateur, tolower() prend
specifiquement un int pour qu'il n'y ait pas de probleme de coercion
du caractere mal venue...
"In all cases the argument is an int, the value of which shall be
representable as an unsigned char or shall equal the value of the macro
EOF."
Si on a un char signé, le passer à tolower etc sans faire un cast en
unsigned char est du comportement indéfini quand la valeur est négative et
différente de EOF (et on a potentiellement un mauvais résultat si la
valeur
est celle d'EOF, ce qui est le cas par exemple dans une locale latin-9
pour
y tréma passé à toupper).
A+
"Aris" a écrit dans le message de news:
47406762$0$29541$In article <473e0559$0$14273$,
Charlie Gordon wrote:m[i] = tolower((unsigned char)m[i]);
Euh, le cast en question, c'est la bibliotheque C qui est censee le
faire en interne... du point de vue utilisateur, tolower() prend
specifiquement un int pour qu'il n'y ait pas de probleme de coercion
du caractere mal venue...
de manière générale, jamais faire de cast explicite là où le cast
implicite fonctionne. C'est la porte ouverte à des conversions invalides
qui peuvent prendre des heures à débugger
Tout à fait d'accord!
Mais dans le cas de islower() et ses amis, le cast en (unsigned char) est
nécessaire si le type 'char' est signé par défaut. islower() n'est défini
que pour toutes les valeurs du type unsigned char et la valeur EOF. Lui
passer un char signé négatif viole cette contrainte, et comme cette fonction
est souvent implémentée comme une macro qui ne valide pas son argument, le
comportement indéfini peut être méchant.
Il est très instructif de regarder l'implémentation de <ctype.h> de la
Glibc. Ils utilisent une astuce DDLF pour contourner cette incohérence du
langage (char signé par défaut) et donnent ainsi un comportement défini pour
tout argument signed char *et* unsigned char en plus de EOF (qui vaut -1).
Ceci dit ils ne peuvent pas résoudre le cas de 'ÿ' qui dans l'encodage
iso-latin1 vaut 255, soit -1 en tant que char signé, et est donc
indiscernable de la valeur de EOF. Donc islower('ÿ') == 0, comme
islower(EOF), ce qui est un peu surprenant.
Moralité: avec gcc, j'utilise toujours l'option -funsigned-char
hmm ok.
"Aris" <aris@badcode.be> a écrit dans le message de news:
47406762$0$29541$fa620c48@newsreader-1.edpnet.be...
In article <473e0559$0$14273$426a74cc@news.free.fr>,
Charlie Gordon <news@chqrlie.org> wrote:
m[i] = tolower((unsigned char)m[i]);
Euh, le cast en question, c'est la bibliotheque C qui est censee le
faire en interne... du point de vue utilisateur, tolower() prend
specifiquement un int pour qu'il n'y ait pas de probleme de coercion
du caractere mal venue...
de manière générale, jamais faire de cast explicite là où le cast
implicite fonctionne. C'est la porte ouverte à des conversions invalides
qui peuvent prendre des heures à débugger
Tout à fait d'accord!
Mais dans le cas de islower() et ses amis, le cast en (unsigned char) est
nécessaire si le type 'char' est signé par défaut. islower() n'est défini
que pour toutes les valeurs du type unsigned char et la valeur EOF. Lui
passer un char signé négatif viole cette contrainte, et comme cette fonction
est souvent implémentée comme une macro qui ne valide pas son argument, le
comportement indéfini peut être méchant.
Il est très instructif de regarder l'implémentation de <ctype.h> de la
Glibc. Ils utilisent une astuce DDLF pour contourner cette incohérence du
langage (char signé par défaut) et donnent ainsi un comportement défini pour
tout argument signed char *et* unsigned char en plus de EOF (qui vaut -1).
Ceci dit ils ne peuvent pas résoudre le cas de 'ÿ' qui dans l'encodage
iso-latin1 vaut 255, soit -1 en tant que char signé, et est donc
indiscernable de la valeur de EOF. Donc islower('ÿ') == 0, comme
islower(EOF), ce qui est un peu surprenant.
Moralité: avec gcc, j'utilise toujours l'option -funsigned-char
hmm ok.
"Aris" a écrit dans le message de news:
47406762$0$29541$In article <473e0559$0$14273$,
Charlie Gordon wrote:m[i] = tolower((unsigned char)m[i]);
Euh, le cast en question, c'est la bibliotheque C qui est censee le
faire en interne... du point de vue utilisateur, tolower() prend
specifiquement un int pour qu'il n'y ait pas de probleme de coercion
du caractere mal venue...
de manière générale, jamais faire de cast explicite là où le cast
implicite fonctionne. C'est la porte ouverte à des conversions invalides
qui peuvent prendre des heures à débugger
Tout à fait d'accord!
Mais dans le cas de islower() et ses amis, le cast en (unsigned char) est
nécessaire si le type 'char' est signé par défaut. islower() n'est défini
que pour toutes les valeurs du type unsigned char et la valeur EOF. Lui
passer un char signé négatif viole cette contrainte, et comme cette fonction
est souvent implémentée comme une macro qui ne valide pas son argument, le
comportement indéfini peut être méchant.
Il est très instructif de regarder l'implémentation de <ctype.h> de la
Glibc. Ils utilisent une astuce DDLF pour contourner cette incohérence du
langage (char signé par défaut) et donnent ainsi un comportement défini pour
tout argument signed char *et* unsigned char en plus de EOF (qui vaut -1).
Ceci dit ils ne peuvent pas résoudre le cas de 'ÿ' qui dans l'encodage
iso-latin1 vaut 255, soit -1 en tant que char signé, et est donc
indiscernable de la valeur de EOF. Donc islower('ÿ') == 0, comme
islower(EOF), ce qui est un peu surprenant.
Moralité: avec gcc, j'utilise toujours l'option -funsigned-char
hmm ok.
"Aris" a écrit dans le message de news:
47406762$0$29541$In article <473e0559$0$14273$,
Charlie Gordon wrote:m[i] = tolower((unsigned char)m[i]);
Euh, le cast en question, c'est la bibliotheque C qui est censee le
faire en interne... du point de vue utilisateur, tolower() prend
specifiquement un int pour qu'il n'y ait pas de probleme de coercion
du caractere mal venue...
de manière générale, jamais faire de cast explicite là où le cast
implicite fonctionne. C'est la porte ouverte à des conversions invalides
qui peuvent prendre des heures à débugger
Tout à fait d'accord!
Mais dans le cas de islower() et ses amis, le cast en (unsigned char) est
nécessaire si le type 'char' est signé par défaut. islower() n'est
défini que pour toutes les valeurs du type unsigned char et la valeur
EOF. Lui passer un char signé négatif viole cette contrainte, et comme
cette fonction est souvent implémentée comme une macro qui ne valide pas
son argument, le comportement indéfini peut être méchant.
Il est très instructif de regarder l'implémentation de <ctype.h> de la
Glibc. Ils utilisent une astuce DDLF pour contourner cette incohérence
du langage (char signé par défaut) et donnent ainsi un comportement
défini pour tout argument signed char *et* unsigned char en plus de EOF
(qui vaut -1). Ceci dit ils ne peuvent pas résoudre le cas de 'ÿ' qui
dans l'encodage iso-latin1 vaut 255, soit -1 en tant que char signé, et
est donc indiscernable de la valeur de EOF. Donc islower('ÿ') == 0,
comme islower(EOF), ce qui est un peu surprenant.
Moralité: avec gcc, j'utilise toujours l'option -funsigned-char
hmm ok.
mais dans ce cas, le cast n'est pas la bonne solution au problème. c'est à
la déclaration du char[] qu'il faut déclarer un unsigned char[], si les
fonctions de manipulation de texte s'attendent à de l'unsigned.
Aussi de toutes facons les caractères > 127 sont tous dépendants du
charset et ne devraient tout simplement jamais se retrouver dans un
tolower... je pense qu'unix a mis trop de temps à sortir des problèmes
d'encodage et qu'il vaut mieux éduquer directement à l'utilisation de
routines utf8/unicode si on doit traiter des chaines internationales.
évidement, c'est hors sujet pour un "bête" programme de TP :)
"Aris" <aris@badcode.be> a écrit dans le message de news:
47406762$0$29541$fa620c48@newsreader-1.edpnet.be...
In article <473e0559$0$14273$426a74cc@news.free.fr>,
Charlie Gordon <news@chqrlie.org> wrote:
m[i] = tolower((unsigned char)m[i]);
Euh, le cast en question, c'est la bibliotheque C qui est censee le
faire en interne... du point de vue utilisateur, tolower() prend
specifiquement un int pour qu'il n'y ait pas de probleme de coercion
du caractere mal venue...
de manière générale, jamais faire de cast explicite là où le cast
implicite fonctionne. C'est la porte ouverte à des conversions invalides
qui peuvent prendre des heures à débugger
Tout à fait d'accord!
Mais dans le cas de islower() et ses amis, le cast en (unsigned char) est
nécessaire si le type 'char' est signé par défaut. islower() n'est
défini que pour toutes les valeurs du type unsigned char et la valeur
EOF. Lui passer un char signé négatif viole cette contrainte, et comme
cette fonction est souvent implémentée comme une macro qui ne valide pas
son argument, le comportement indéfini peut être méchant.
Il est très instructif de regarder l'implémentation de <ctype.h> de la
Glibc. Ils utilisent une astuce DDLF pour contourner cette incohérence
du langage (char signé par défaut) et donnent ainsi un comportement
défini pour tout argument signed char *et* unsigned char en plus de EOF
(qui vaut -1). Ceci dit ils ne peuvent pas résoudre le cas de 'ÿ' qui
dans l'encodage iso-latin1 vaut 255, soit -1 en tant que char signé, et
est donc indiscernable de la valeur de EOF. Donc islower('ÿ') == 0,
comme islower(EOF), ce qui est un peu surprenant.
Moralité: avec gcc, j'utilise toujours l'option -funsigned-char
hmm ok.
mais dans ce cas, le cast n'est pas la bonne solution au problème. c'est à
la déclaration du char[] qu'il faut déclarer un unsigned char[], si les
fonctions de manipulation de texte s'attendent à de l'unsigned.
Aussi de toutes facons les caractères > 127 sont tous dépendants du
charset et ne devraient tout simplement jamais se retrouver dans un
tolower... je pense qu'unix a mis trop de temps à sortir des problèmes
d'encodage et qu'il vaut mieux éduquer directement à l'utilisation de
routines utf8/unicode si on doit traiter des chaines internationales.
évidement, c'est hors sujet pour un "bête" programme de TP :)
"Aris" a écrit dans le message de news:
47406762$0$29541$In article <473e0559$0$14273$,
Charlie Gordon wrote:m[i] = tolower((unsigned char)m[i]);
Euh, le cast en question, c'est la bibliotheque C qui est censee le
faire en interne... du point de vue utilisateur, tolower() prend
specifiquement un int pour qu'il n'y ait pas de probleme de coercion
du caractere mal venue...
de manière générale, jamais faire de cast explicite là où le cast
implicite fonctionne. C'est la porte ouverte à des conversions invalides
qui peuvent prendre des heures à débugger
Tout à fait d'accord!
Mais dans le cas de islower() et ses amis, le cast en (unsigned char) est
nécessaire si le type 'char' est signé par défaut. islower() n'est
défini que pour toutes les valeurs du type unsigned char et la valeur
EOF. Lui passer un char signé négatif viole cette contrainte, et comme
cette fonction est souvent implémentée comme une macro qui ne valide pas
son argument, le comportement indéfini peut être méchant.
Il est très instructif de regarder l'implémentation de <ctype.h> de la
Glibc. Ils utilisent une astuce DDLF pour contourner cette incohérence
du langage (char signé par défaut) et donnent ainsi un comportement
défini pour tout argument signed char *et* unsigned char en plus de EOF
(qui vaut -1). Ceci dit ils ne peuvent pas résoudre le cas de 'ÿ' qui
dans l'encodage iso-latin1 vaut 255, soit -1 en tant que char signé, et
est donc indiscernable de la valeur de EOF. Donc islower('ÿ') == 0,
comme islower(EOF), ce qui est un peu surprenant.
Moralité: avec gcc, j'utilise toujours l'option -funsigned-char
hmm ok.
mais dans ce cas, le cast n'est pas la bonne solution au problème. c'est à
la déclaration du char[] qu'il faut déclarer un unsigned char[], si les
fonctions de manipulation de texte s'attendent à de l'unsigned.
Aussi de toutes facons les caractères > 127 sont tous dépendants du
charset et ne devraient tout simplement jamais se retrouver dans un
tolower... je pense qu'unix a mis trop de temps à sortir des problèmes
d'encodage et qu'il vaut mieux éduquer directement à l'utilisation de
routines utf8/unicode si on doit traiter des chaines internationales.
évidement, c'est hors sujet pour un "bête" programme de TP :)
Aussi de toutes facons les caractères > 127 sont tous dépendants du
charset et ne devraient tout simplement jamais se retrouver dans un
tolower...
je pense qu'unix a mis trop de temps à sortir des problèmes
d'encodage et qu'il vaut mieux éduquer directement à l'utilisation de
routines utf8/unicode si on doit traiter des chaines internationales.
Aussi de toutes facons les caractères > 127 sont tous dépendants du
charset et ne devraient tout simplement jamais se retrouver dans un
tolower...
je pense qu'unix a mis trop de temps à sortir des problèmes
d'encodage et qu'il vaut mieux éduquer directement à l'utilisation de
routines utf8/unicode si on doit traiter des chaines internationales.
Aussi de toutes facons les caractères > 127 sont tous dépendants du
charset et ne devraient tout simplement jamais se retrouver dans un
tolower...
je pense qu'unix a mis trop de temps à sortir des problèmes
d'encodage et qu'il vaut mieux éduquer directement à l'utilisation de
routines utf8/unicode si on doit traiter des chaines internationales.
mais dans ce cas, le cast n'est pas la bonne solution au problème. c'est à
la déclaration du char[] qu'il faut déclarer un unsigned char[],
si les fonctions de manipulation de texte s'attendent à de l'unsigned.
Aussi de toutes facons les caractères > 127 sont tous dépendants du charset
et ne devraient tout simplement jamais se retrouver dans un tolower...
je pense qu'unix a mis trop de temps à sortir des problèmes d'encodage et
qu'il vaut mieux éduquer directement à l'utilisation de routines
utf8/unicode si on doit traiter des chaines internationales.
mais dans ce cas, le cast n'est pas la bonne solution au problème. c'est à
la déclaration du char[] qu'il faut déclarer un unsigned char[],
si les fonctions de manipulation de texte s'attendent à de l'unsigned.
Aussi de toutes facons les caractères > 127 sont tous dépendants du charset
et ne devraient tout simplement jamais se retrouver dans un tolower...
je pense qu'unix a mis trop de temps à sortir des problèmes d'encodage et
qu'il vaut mieux éduquer directement à l'utilisation de routines
utf8/unicode si on doit traiter des chaines internationales.
mais dans ce cas, le cast n'est pas la bonne solution au problème. c'est à
la déclaration du char[] qu'il faut déclarer un unsigned char[],
si les fonctions de manipulation de texte s'attendent à de l'unsigned.
Aussi de toutes facons les caractères > 127 sont tous dépendants du charset
et ne devraient tout simplement jamais se retrouver dans un tolower...
je pense qu'unix a mis trop de temps à sortir des problèmes d'encodage et
qu'il vaut mieux éduquer directement à l'utilisation de routines
utf8/unicode si on doit traiter des chaines internationales.
Aussi de toutes facons les caractères > 127 sont tous dépendants du
charset
EBCDIC n'est pourtant pas mort.
Aussi de toutes facons les caractères > 127 sont tous dépendants du
charset
EBCDIC n'est pourtant pas mort.
Aussi de toutes facons les caractères > 127 sont tous dépendants du
charset
EBCDIC n'est pourtant pas mort.