[C] Problèmes avec les chaines de caractères

Problèmes avec les chaines de caractères [C] - C - Programmation

Marsh Posté le 24-07-2007 à 15:42:46    

Bonjour (encore http://forum.judgehype.com/icones/smilies/ack.gif)

 

Je me risque encore à poster un message parce que mine de rien, même si vous prenez pas des pincettes parfois, vous êtes de bon conseil  :D

 

Alors alors, voilà en gros ce que fait mon programme : Quand j'appuie sur un bouton "Load", le programme ouvre un fichier, puis effectue une boucle pour le lire (avec fgets). A chaque tour de boucle, j'incrémente un compteur qui me permet de garder en mémoire le numéro de la ligne à laquelle se trouve le programme.

 

Voici ce que je souhaiterais faire : lorsque le programme est à la ligne 1, il recopie l'intégralité de la ligne dans un Widget de saisie de texte.
Lorsque le programme est à la ligne 2, il enregistre la ligne dans une variable pour pouvoir l'utiliser plus tard.

 

Je rencontre deux problèmes :

  • Le premier, c'est que lorsque le programme est à la ligne 1, il me recopie la ligne dans le Widget mais il m'affiche le retour chariot à la fin de la ligne avec un drôle de symbole genre 'dessin qui veut rien dire'.
  • Le second problème, plus embêtant, et que je souhaiterais effectuer des opérations sur la seconde ligne. En effet, le programme lit la seconde ligne, l'enregistre dans une variable de type char, et me l'affiche. Elle vaut :    1.0000000000 (avec trois espaces avant le '1'). Je souhaiterais virer les trois espaces, et enregistrer le 1.0000000 sous forme de float. Y'a-t-il des fonctions simples pour cela ? J'ai regardé dans la documentation de la librairie string.h, mais visiblement je n'ai rien trouvé de direct.


Voici le code, pour info :

Code :
  1. lineCount = 1 ; // J'initialise le compteur de lignes
  2. while (fgets(line, 1024, contcarFile) != NULL)
  3. {
  4. if (lineCount == 1) // Je m'arrête à la première ligne
  5. {
  6. strcpy(contcarLabel, line) ; // J'enregistre la première ligne dans une chaîne
  7. gtk_entry_set_text(GTK_ENTRY(widget), contcarLabel) ;  //Je recopie la chaine dans le Widget
  8. }
  9. else if (lineCount == 2) // Je m'arrête à la deuxième ligne
  10. {
  11. strcpy(scaleFactor, line) ;  // J'enregistre la deuxième ligne dans une chaîne
  12. fprintf(stderr, "Scale Factor is : %s, scaleFactor) ; //Je demande à afficher la chaîne juste pour voir. Il m'affiche : '    1.000000000'
  13. }
  14. lineCount = lineCount + 1 ;  // J'incrémente le compteur de lignes
  15. }
 

Edit : Désolé je ne sais pas comment mettre des tabulations pour rendre le code plus clair -- Je n'ai pas mis les déclarations des variables

 

Merci encore  :hello:  

Message cité 1 fois
Message édité par Sinner le 24-07-2007 à 15:44:18
Reply

Marsh Posté le 24-07-2007 à 15:42:46   

Reply

Marsh Posté le 24-07-2007 à 15:48:28    

Sinner a écrit :

  • Le premier, c'est que lorsque le programme est à la ligne 1, il me recopie la ligne dans le Widget mais il m'affiche le retour chariot à la fin de la ligne avec un drôle de symbole genre 'dessin qui veut rien dire'.

Tu récupères donc la sous-chaines du caractères 0 jusqu'à l'avant-dernier.
 

Sinner a écrit :

  • Le second problème, plus embêtant, et que je souhaiterais effectuer des opérations sur la seconde ligne. En effet, le programme lit la seconde ligne, l'enregistre dans une variable de type char, et me l'affiche. Elle vaut :    1.0000000000 (avec trois espaces avant le '1'). Je souhaiterais virer les trois espaces, et enregistrer le 1.0000000 sous forme de float. Y'a-t-il des fonctions simples pour cela ? J'ai regardé dans la documentation de la librairie string.h, mais visiblement je n'ai rien trouvé de direct.

atof ?


---------------
Töp of the plöp
Reply

Marsh Posté le 24-07-2007 à 15:52:51    

_darkalt3_ a écrit :


Tu récupères donc la sous-chaines du caractères 0 jusqu'à l'avant-dernier.


 


 
Merci pour la réponse rapide. J'ai déjà essayé atof, mais il m'affiche 'null', sûrement parce que j'ai dû m'enbrouiller avec les 'string' et 'float'.
 
Je vais potasser tes propositions.
 
Merci :)

Reply

Marsh Posté le 24-07-2007 à 16:19:15    

Désolé pour le double post.

 

J'ai donc modifié mon code pour la seconde ligne :

 
Code :
  1. else if (lineCount == 2)
  2. {
  3.         strcpy(scaleFactor, line) ;
  4.         scale = atof(scaleFactor) ;
  5.         fprintf(stderr, "Scale Factor : %f \n", scale) ;
  6. }
 

Il m'affiche bien 1.00000. Merci :jap:

 

Pour la première ligne, j'ai modifié le code :

Code :
  1. if (lineCount == 1)
  2. {
  3.         length = strlen(line) ;          // Il m'affiche 31. C'est bien le nombre de caractères de la première ligne
  4.         strncpy(contcarLabel, line, length) ;   // J'enregistre la ligne dans une chaine, en ne prenant pas le dernier caractère
  5.         gtk_entry_set_text(GTK_ENTRY(widget), contcarLabel) ; // J'affiche dans le widget
  6. }
 

Il m'affiche la première ligne avec plein de caractères bizarre derrière, ainsi que le message d'erreur suivant :


pango-WARNING **: Invalid UTF-8 string passed to pango_layout_set_text()

 

Je dois sûrement faire une erreur dans le : strncpy(contcarLabel, line, length) ;

 

Edit : En fait il semblerait que le programme n'aime pas recopier une chaîne dans le widget (ou ailleurs) s'il n'y a pas de retour chariot à la fin de la chaîne.
Or mon but c'est de supprimer le retour chariot parce que ça me fait un symbole louche à l'impression :/

Message cité 1 fois
Message édité par Sinner le 24-07-2007 à 16:40:52
Reply

Marsh Posté le 24-07-2007 à 16:33:54    

Sinner a écrit :

Je dois sûrement faire une erreur dans le : strncpy(contcarLabel, line, length) ;


T'aurais pas juste supprimé le '\0' au lieu du dernier caractère ?


---------------
Töp of the plöp
Reply

Marsh Posté le 24-07-2007 à 16:35:43    

Beh en fait mon but c'était de supprimer le '\0', parce que ça me fait un symbole bizarre à l'impression.

Reply

Marsh Posté le 24-07-2007 à 16:42:53    

ah ouais je dis n'imp ok


---------------
Töp of the plöp
Reply

Marsh Posté le 24-07-2007 à 16:46:25    

Mais sinon tu as raison, lorsque j'enlève le '\0' volontairement à la fin de la chaîne, et que je demande à afficher la chaîne, il n'aime po.

Reply

Sujets relatifs:

Leave a Replay

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