pb valeur ascii

pb valeur ascii - C++ - Programmation

Marsh Posté le 23-12-2004 à 13:21:32    

Déclaration de la fonction :

Code :
  1. int testValeur(char *test);


 
Corps de la fonction :

Code :
  1. int testValeur(char *test){
  2.   unsigned  int cpt;
  3.   char caract;
  4.   int flag=1;
  5.   if ((test[0] =='+')||(test[0]=='-')||(test[0]=='/')||(test[0]=='*')){
  6.     return 0;
  7.   }else{
  8.     for (cpt=0;cpt<strlen(test);cpt++){
  9.       caract=test[cpt];
  10.       if((caract>=':'&&caract<='~')||(caract>='!'&&caract<=')')){
  11. flag=0;//si c'est un caractère est une lettre c'est une erreur.
  12.       }
  13.     }
  14.     if (flag==0) return -1;
  15.     else return 1;
  16.   }
  17. }


Message édité par LN22 le 23-12-2004 à 16:42:31
Reply

Marsh Posté le 23-12-2004 à 13:21:32   

Reply

Marsh Posté le 23-12-2004 à 13:45:37    

 Bonjour,
  1/ Votre code vérifie si le PREMIER caractère de la chaîne vaut '*' : c'est bien ce que vous vouliez ?
  2/ Pour tester si le caractère c vaut '*' on fait c=='*'; pour savoir si la chaîne s vaut "*" on fait s == "*". Est-ce  que vous voyez la différence ?
  3/ il faudrait que vous postiez plus de code pour savoir d'où vient le problème.

Reply

Marsh Posté le 23-12-2004 à 14:34:41    

suizokukan a écrit :

pour savoir si la chaîne s vaut "*" on fait s == "*".


 
Avec les std::string oui, mais pas si c'est un char* :D


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 23-12-2004 à 14:58:30    

heu bah en fait on souhaite verifier que le premier caractere de notre chaine est un operateur mathematique(+ - * /) tous les otres operateur fonctionnent sf le * pk ?,
 
  if ((test[0]=='+')||(test[0]=='-')||(test[0]=='/')||(test[0]=='*')){
    return 0;
  }

Reply

Marsh Posté le 23-12-2004 à 15:56:17    

 C'est bizarre; il y a certains caractères avec qui il pourrait y avoir des problèmes (genre " et \ qu'il faut écrire '\"' et '\\') mais le caractère '*' n'en fait pas partie. Vous êtes certains des données avec lesquelles vous faites le test ?

Reply

Marsh Posté le 23-12-2004 à 16:02:13    

Oui, j'en suis certain puisque c'est moi qui lui rentre en ligne de commande

Reply

Marsh Posté le 23-12-2004 à 16:07:35    

 Essayez de tester la fonction sans passer par la ligne de commande, en initialisant la chaîne test juste avant votre
 

Code :
  1. if ((test[0]=='+')||(test[0]=='-')||(test[0]=='/')||(test[0]=='*')){
  2.     return 0;
  3.   }


 
  Vous essayez avec "+123", "-123", "/123" et enfin "*123" et vous regardez à chaque fois ce que renvoie la fonction. Mais je crois que l'erreur ne vient vraiment pas de la manière dont le test est conçu mais plutôt de ce qui se passe avant.

Reply

Marsh Posté le 23-12-2004 à 16:18:08    

en effet, si je ne passe pas par la ligne de commande mon teste fonctionne corectement.
Mais bon pourquoi cela produit une erreur quand je passe par la ligne de commande ???car moi il faut que je pase par la ligne de commande

Reply

Marsh Posté le 23-12-2004 à 16:21:29    

 L'erreur est donc entre le moment où vous récupérez la ligne de commande et le moment où vous passez les données au  
 

Code :
  1. if ((test[0]=='+')||(test[0]=='-')||(test[0]=='/')||(test[0]=='*')){
  2.         return 0;
  3.        }


 
  Postez donc le reste du code utile.

Reply

Marsh Posté le 23-12-2004 à 16:24:36    

int main(int argc, char *argv[]){
   
if(argc<4){
    cout<<"Erreur d'utilisation."<<endl;
    cout<<"Usage : <nom programme> <opération>."<<endl;
    return 1;
  }
  else{
    MaPile=new Pile();
    while(argc!=1){
      verif=testValeur(argv[tmp]);
      if (verif==-1){
 cout<<"erreur de syntaxe!!!"<<endl;
 exit (1);
      }
      MaPile->Empiler(argv[tmp]);
      argc--;
      tmp++;
    }

Reply

Marsh Posté le 23-12-2004 à 16:24:36   

Reply

Marsh Posté le 23-12-2004 à 16:26:05    

voila en gros l'appel de la fonction de test

Reply

Marsh Posté le 23-12-2004 à 16:31:01    

Avant toutes choses, dépêche-toi de mettre ton code entre des balises avant que ça ne rale...
 
1/ édite ton message - cherche l'icône dans cette fenêtre qui se trouve à côté de 'Posté le 23-12-2004 à 13:16:37' -
2/ une fois dans la fenêtre d'édition sélectionne ton code
3/ utilise l'icône C/C++ qui mettra ta sélection entre deux balises.
 
et surtout apprends à INDENTER ton code svp !


Message édité par suizokukan le 23-12-2004 à 16:50:22
Reply

Marsh Posté le 23-12-2004 à 16:33:56    

 1/Même si ce n'est pas le fond du problème, supprime l' exit() de ton main et débrouille-toi pour que main() renvoie une valeur (EXIT_SUCCESS si ok/EXIT_FAILURE en cas d'erreur)
 
  2/La ligne de code que t'as postée au-dessus [if(test)] fait donc partie de la fonction testValeur(). Poste s'il te plaît le contenu exact de cette fonction (avec sa déclaration).

Reply

Marsh Posté le 23-12-2004 à 16:36:36    

  Et que vaut tmp avant d'arriver ici :
 

Code :
  1. verif=testValeur(argv[tmp]);


 
Donne du code un peu plus complet sinon on va y passer trop de temps.

Reply

Marsh Posté le 23-12-2004 à 16:43:11    

voila le code de la fonction testValeur

Reply

Marsh Posté le 23-12-2004 à 16:44:41    

 Ok c'est bon, je vois peut-être d'où vient l'erreur :
Le caractère '*' a une signification spéciale pour l'OS; pour supprimer cette signification, il faut mettre tes arguments entre guillemets.  
   Du genre :    mon_prog.exe "+123" "*627"
 
  C'était vraiment trop bête...

Reply

Marsh Posté le 23-12-2004 à 16:49:15    

oui merci comme tu dis c'est très bête mais bon ca complique l'utilisation de mon programme.

Reply

Marsh Posté le 23-12-2004 à 16:57:50    

Dis à l'utilisateur de mettre un x au lieu du * [:joce]
Effectivement on ne peut pas passer n'importe quel caractère en argument à un programme...


---------------
Réalisation amplis classe D / T      Topic .Net - C# @ Prog
Reply

Marsh Posté le 23-12-2004 à 17:00:33    

ouep je pense ke je vais faire ca mais ca va demandé bcp d'effort a l'utilisateur lol

Reply

Marsh Posté le 23-12-2004 à 17:01:08    

 Sinon passe tes arguments via un fichier temporaire ... ou bien mets les tous entre guillemets sur ta ligne de commande. En quoi est-ce que cela complique l'utilisation de ton programme ?

Reply

Marsh Posté le 23-12-2004 à 18:28:57    

bah le fait que l'utilisateur mette des guillement sur le * ca evient contraignant pour lui mais bon je pense que je vais faire comme TotalRecall le suggérrait et remplacer le le * par un x.
Merci quand même de ton aide

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed