manip sur une String marche sous linux et pas sous windows [ C ] - Programmation
Marsh Posté le 02-02-2002 à 21:17:09
j'avais pas prévu le smiley.
A cet endroit, c'est: default:printf("%c",mot[i]);
Marsh Posté le 02-02-2002 à 23:48:26
jcdenton2 a écrit a écrit : j'avais pas prévu le smiley. A cet endroit, c'est: default:printf("%c",mot[i]); |
LOOL
Marsh Posté le 03-02-2002 à 00:25:54
C'est déjà arrivé plusieurs fois, je ne vois plus vraiment ce qu'il y a de drôle mis à part un petit sourire. Mais bon...
Bon, sinon as-tu essayer de coder avec des int au lieu d'unsigned int? Pour les codes des caractères ascii as-tu essayé de les remplacer par le caractère (par exemple 200 par 'È'.
Ce sont peut-être des idées un peu bêtes, mais je tombe de sommeil alors j'essaie de proposer comme je peux.
Ah oui: Pourquoi des accolades autour de chaque case? Tu peux les enlever sans problème s'ils te gènent.
[edtdd]--Message édité par Krueger--[/edtdd]
Marsh Posté le 03-02-2002 à 01:27:46
sinon ss window essaie plutot
gets(mot); a la place de scanf("%s",mot);
Marsh Posté le 03-02-2002 à 11:03:11
Alors, le gets ne change rien, le int non plus. Ce qui est zarb, c que qd j'affiche le code ascii de chaque caractère lu dans le tableau, il me sort un nombre différent du code réel à chaque fois...
ex: pour un 'a', il devrait sortir 96 mais il sort 97, pour un 'é', c'est 130 au lieu de 233 et pour 'è' c'est 138 au lieu de 232. (la différence ne reste pas constante selon le caractère...)
Autre chose: je peux pas mette un int signé sinon il me sort des codes négatifs.
G l'impression que c'est une différence de codage de caractères sous windows par rapport à linux.
Mais comment l'obliger à utiliser la table ascii standard et pas unicode ou un truc dans le genre ???
Marsh Posté le 03-02-2002 à 12:05:18
heu, je comprend pas trop ton prog ...
en lui rentre "élève" et il affiche "élève" ?
bon bref
l'erreur peut venir de divers endroits
d'abord, tu executes en mode console ?
si oui, ben alors c'est noemal qu'il t'affiche pas les bons caracteres ...
par exemple,
Code :
|
t'affiches "ù"
c'est du au DOS ... c'est les caracteres du DOS qui sont utilisés.
Ca me renvoit vers une deuxième remarque : ton code n'est pas tres lisible / portable
en effet, tu utilises des nombres dans tes tests, et tu es donc lies a ceux ci
or, les codes des caracteres peuvent varier en fonction de la police, du jeu utilisé (langue, ou comme pour l'exemple du DOS)
voici un exemple de code à utiliser, plus lisible
Code :
|
c'est comme quand on transforme les caracteres '1' en chiffre 1,
faut pas faire
Code :
|
mais
Code :
|
Pour etre sur que ton probleme n'est pas lies aux caracteres DOS, cree un fichier et remplace le printf par des fprintf dans ton fichier
puis ouvre le fichier au notepad, et tu devrais avoir les bons caracteres
Moi je te conseille plutot de faire ca:
Code :
|
mais je suis presque sur que ton probleme viens du mode console
"il me sort un nombre différent du code réel à chaque fois...
ex: pour un 'a', il devrait sortir 96 mais il sort 97, pour un 'é', c'est 130 au lieu de 233 et pour 'è' c'est 138 au lieu de 232."
je viens de tester :
ouvre un fenetre de commande et tape :
echo ééé > test.txt
ouvre test.txt ... oh surprise, tu as ,,, à la place de ééé ...
pour etre *sûr*, créé un fichier au notepad où tu écris élève, et lis avec fscanf dans le fichier à la place de saisir en ligne de commande
pour le a par contre c'est bizarre ...
peut etre l'histoire signed/unsigned ...
des fois c'est assez bizarre ça aussi (les conversions signed/unsigned) surtout entre types differents
pour etre sûr, => unsigned char mot[50]
et aussi unsigned char codeascii, c'est aussi bien
bon courage
Marsh Posté le 03-02-2002 à 12:26:07
HelloWorld a écrit a écrit : heu, je comprend pas trop ton prog ... en lui rentre "élève" et il affiche "élève" ? :??: bon bref l'erreur peut venir de divers endroits d'abord, tu executes en mode console ? si oui, ben alors c'est noemal qu'il t'affiche pas les bons caracteres ... par exemple,
|
Oui, c du mode DOS console.
Le but du jeu, c'est d'entrer un mot en caractères accentués et ressortir le même mot mais avec les caractères accentués remplacés par leur code XML. un & suivi d'un # suivi du code ascii du caractère.
C'est ce que g voulu mettre en exemple avec 'élève' mais je crois que quand j'ai mis le code du é et du è, le browser l'a traduit automatiquement en caractères normaux...
Je v essayer tes conseils, merci !
Marsh Posté le 03-02-2002 à 13:44:57
Bon, ben g modifié le code en ne passant plus par le code ascii mais directement par le cractère lui même. Encore 1 fois, ça passe nickel sous linux, et ça me ressort le mot tel quel sous win.
Effectivement, ça a l'air lié au dos, qui convertit tout seul les codes XML envoyés sur stdout.
Pfff, je suis bloqué...
Si qq veut tester ce prog sous linux ou win pour voir s'il passe chez lui, je lui envoie par mail.
Sinon, merci pour les coups de main. @+ !
Marsh Posté le 03-02-2002 à 15:00:29
Je me souviens que fu un temps, y'a longtemps, avec Borland C++, je sais plus comment (je debutais, j'avais donc rien touche ... ), mes programmes "console" n'etaient pas executes dans la console habituelle Windows (fond noir ...) mais c'est Borland qui me créait une fenetre genre notepad et ça servait de console. Pour toi ce serait l'idéal : un vrai programme Windows, et tu serais pas emm**** par ces caracteres DOS. Je viens de regarder vite fait, j'ai pas trouvé d'option de ce style dans BC++ 4.
Peut etre etait ce avec le 5.
Si quelqu'un sait comment faire ça ... (une option de projet qui permet d'utiliser une console autre que celle de Windows, à savoir une fenetre classique genre traitement de texte)
Marsh Posté le 03-02-2002 à 22:20:01
ca doit etre le compilo, parceque sous visual c++ ca marche tres bien avec visual C++
Marsh Posté le 02-02-2002 à 21:14:49
C un prog qui doit remplacer les caractères accentués d'un mot fournit par l'utilisateur en codes XML.
ex: on entre "élève", ça doit sortir élève.
Je l'ai compilé et executé sous Red Hat 7.1, ça marche, et sous win XP et Me, ça plante.
C koi le pb ?
Voilà le source:
#include<stdio.h>
#include<string.h>
main()
{
int i=0; //compteur pour le tableau de caractères représentant le mot
char mot[50]; // le mot entré par l'utilisateur
unsigned int codascii; // le code ASCII de la lettre lue dans le tableau
printf("Entrez votre mot :\n" ); // l'utilisateur entre le mot à transcrire
scanf("%s",mot);
printf("\nTranscription : " );
while(i<50) // parcours du tableau
{
if (!mot[i]) exit(0); // on arrête la transcription dès qu'il n'y a plus rien à lire dans le tableau
codascii=(unsigned int)(mot[i]); // on récupère le code ASCII de la case de tableau courante
if (codascii > 128) codascii+=256; // on lui rajoute 256 si il est supérieur à 128 (sais pas pourquoi mais sinon ça marche pas.)
switch (codascii) // selon le code ASCII
{
case 200:{printf("È" );break;} // cas de remplacement de la lettre par un code XML
case 201:{printf("É" );break;}
case 202:{printf("Ê" );break;}
case 203:{printf("Ë" );break;}
case 224:{printf("à" );break;}
case 225:{printf("á" );break;}
case 226:{printf("â" );break;}
case 228:{printf("ä" );break;}
case 231:{printf("ç" );break;}
case 232:{printf("è" );break;}
case 233:{printf("é" );break;}
case 234:{printf("ê" );break;}
case 235:{printf("ë" );break;}
case 238:{printf("î" );break;}
case 239:{printf("ï" );break;}
case 244:{printf("ô" );break;}
case 249:{printf("ù" );break;}
case 251:{printf("û" );break;}
case 252:{printf("ü" );break;}
default:printf("%c",mot[i]); // sinon, on réecrit la lettre telle quelle
}
i++; // pour passer à l'élement suivant
} // fin du while
}
// compilé avec CC sur une RED HAT 7.1, ça tourne impec'. si ça marche pas ailleurs, problème de portabilité ?