Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1560 connectés 

  FORUM HardWare.fr
  Programmation

  [ C ] manip sur une String marche sous linux et pas sous windows

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[ C ] manip sur une String marche sous linux et pas sous windows

n°96080
jcdenton2
AVP2 addicted
Posté le 02-02-2002 à 21:14:49  profilanswer
 

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

mood
Publicité
Posté le 02-02-2002 à 21:14:49  profilanswer
 

n°96082
jcdenton2
AVP2 addicted
Posté le 02-02-2002 à 21:17:09  profilanswer
 

j'avais pas prévu le smiley.
A cet endroit, c'est: default:printf("%c",mot[i]);

n°96115
corvincent
Posté le 02-02-2002 à 23:48:26  profilanswer
 

jcdenton2 a écrit a écrit :

j'avais pas prévu le smiley.
A cet endroit, c'est: default:printf("%c",mot[i]);  




 
LOOL  :lol:

n°96123
Krueger
tout salaire demande dutravail
Posté le 03-02-2002 à 00:25:54  profilanswer
 

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... :sarcastic:
 
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. :sleep:
 
Ah oui: Pourquoi des accolades autour de chaque case? :confused: Tu peux les enlever sans problème s'ils te gènent.

 

[edtdd]--Message édité par Krueger--[/edtdd]


---------------
"Colère et intolérance sont les ennemis d'une bonne compréhension." Gandhi
n°96128
zobkiller6​66
Fini les études
Posté le 03-02-2002 à 01:27:46  profilanswer
 

sinon ss window essaie plutot
 
gets(mot); a la place de scanf("%s",mot);

n°96157
jcdenton2
AVP2 addicted
Posté le 03-02-2002 à 11:03:11  profilanswer
 

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

n°96167
HelloWorld
Salut tout le monde!
Posté le 03-02-2002 à 12:05:18  profilanswer
 

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 :
  1. printf("é" );


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 :
  1. (...)
  2.     case 'È':{printf("È" );break;}
  3.     case 'É':{printf("É" );break;}
  4.     case 'Ê':{printf("Ê" );break;}
  5. (...)


 
c'est comme quand on transforme les caracteres '1' en chiffre 1,
faut pas faire

Code :
  1. chiffre = caractere - 45;


mais

Code :
  1. chiffre = caractere - '0';


 
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 :
  1. unsigned char mot[50]; 
  2.     int i;
  3.     printf("Entrez votre mot :\n" );
  4.     scanf("%s", mot);
  5.     printf("\nTranscription : " );
  6.     for(i = 0; i < 50; i++)
  7.     {
  8.         if(mot[i] == 0) break;
  9.         switch (mot[i])
  10.         {
  11.             case 'È':
  12.                 printf("È" );
  13.                 break;
  14.             (...)
  15.             default :
  16.                 printf("%c", mot[i]);
  17.         }
  18.     }
  19.     return 0;


 
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


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°96177
jcdenton2
AVP2 addicted
Posté le 03-02-2002 à 12:26:07  profilanswer
 

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,

Code :
  1. printf("é" );


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 :
  1. (...)
  2.     case 'È':{printf("È" );break;}
  3.     case 'É':{printf("É" );break;}
  4.     case 'Ê':{printf("Ê" );break;}
  5. (...)


 
c'est comme quand on transforme les caracteres '1' en chiffre 1,
faut pas faire

Code :
  1. chiffre = caractere - 45;


mais

Code :
  1. chiffre = caractere - '0';


 
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 :
  1. unsigned char mot[50]; 
  2.     int i;
  3.     printf("Entrez votre mot :\n" );
  4.     scanf("%s", mot);
  5.     printf("\nTranscription : " );
  6.     for(i = 0; i < 50; i++)
  7.     {
  8.         if(mot[i] == 0) break;
  9.         switch (mot[i])
  10.         {
  11.             case 'È':
  12.                 printf("È" );
  13.                 break;
  14.             (...)
  15.             default :
  16.                 printf("%c", mot[i]);
  17.         }
  18.     }
  19.     return 0;


 
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  




 
 
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 !

n°96209
jcdenton2
AVP2 addicted
Posté le 03-02-2002 à 13:44:57  profilanswer
 

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. @+ !

n°96251
HelloWorld
Salut tout le monde!
Posté le 03-02-2002 à 15:00:29  profilanswer
 

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)


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
mood
Publicité
Posté le 03-02-2002 à 15:00:29  profilanswer
 

n°96350
rastan
Posté le 03-02-2002 à 22:20:01  profilanswer
 

ca doit etre le compilo, parceque sous visual c++ ca marche tres bien avec visual C++


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation

  [ C ] manip sur une String marche sous linux et pas sous windows

 

Sujets relatifs
[JAVA] débutant StringInt -> String en Java
[ORACLE/LINUX] quelle bonne version de linux pour 1 client oracle ?[javascript] comment ca marche confirm()?
Une version de prolog 4 pour windowsPerl et Javascript....comment faire un grosse manip de checkbox????
Speedtouch et linux ??!!![asm encore et toujours] pour des matrices... ca marche comment ??
VC++ SDK DirectX 8.1 sous Windows XP --> merdouille !? 
Plus de sujets relatifs à : [ C ] manip sur une String marche sous linux et pas sous windows


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR