Récupérer les nombres d'une chaine de caractère ???

Récupérer les nombres d'une chaine de caractère ??? - C - Programmation

Marsh Posté le 19-06-2012 à 19:06:27    

Bonjour,
Je récupère par UDP une chaine de caractère composé de réelles séparés par des virgules.
Je voudrais récupérer dans un tableau de double ces chiffres (sans les virgules).
Pour convertir un char en double, je dois utiliser atof (sauf erreur de ma part).
Mon problème est que je n'arrive pas à récupérer et stocker chaque chiffre entre virgules.
 
Par exemple :
- Si je recois par UDP :
maChaineUdp = "23.165313, 2.461, 789.1131323123 etc...";
- Je voudrais avoir :
chiffreRecu[0] = 23.165313;
chiffreRecu[1] = 2.461;
chiffreRecu[2] = 789.1131323123;
etc... ;
 
Comment faire SVP je n'y arrive vraiment pas ?
Merci.

Reply

Marsh Posté le 19-06-2012 à 19:06:27   

Reply

Marsh Posté le 19-06-2012 à 19:11:38    

UDP, tu parles du protocole internet ? Parce que dans ce cas, pourquoi tu n’envoies pas directement tes doubles ?
 
Sinon, ben faut parcourir ta chaine de caractère et découper à chaque ',' en stockant ça dans un tableau de char*.


---------------
Perhaps you don't deserve to breathe
Reply

Marsh Posté le 19-06-2012 à 20:23:08    

En utilisant sscanf, ça se fait facilement :
 

Code :
  1. #include <stdio.h>
  2.  
  3. int main(int argc, char *argv[])
  4. {
  5.     char * maChaineUdp = "23.165313, 2.461, 789.1131323123";
  6.     char * p;
  7.     double chiffreRecu[16];
  8.     int    n, i;
  9.  
  10.     for (p = maChaineUdp, i = 0; sscanf(p, "%lf%n", chiffreRecu + i, &n) >= 1; i ++) {
  11.         p += n; if (*p == ',') p ++;
  12.         // Edit: on vérifie que ça ne déborde pas...
  13.         if (i == sizeof chiffreRecu / sizeof chiffreRecu[0]-1) break;
  14.     }
  15.  
  16.     for (n = 0; n <= i; n ++)
  17.         fprintf(stderr, "chiffreRecu[%d] = %f\n", n, chiffreRecu[n]);
  18.  
  19.     return 0;
  20. }


Message édité par tpierron le 19-06-2012 à 20:27:01
Reply

Marsh Posté le 24-06-2012 à 22:12:56    

Terminapor a écrit :

UDP, tu parles du protocole internet ? Parce que dans ce cas, pourquoi tu n’envoies pas directement tes doubles ?


Attention, le codage des doubles peut varier d'une architecture à l'autre. On ne peut pas envoyer des doubles en brut et être assuré qu'ils seront compris de la même façon de l'autre coté...
 

Terminapor a écrit :

Sinon, ben faut parcourir ta chaine de caractère et découper à chaque ',' en stockant ça dans un tableau de char*.


Ce que fait strtok_r()...

Message cité 1 fois
Message édité par Sve@r le 24-06-2012 à 22:14:15
Reply

Marsh Posté le 25-06-2012 à 00:09:57    

Sve@r a écrit :


Attention, le codage des doubles peut varier d'une architecture à l'autre. On ne peut pas envoyer des doubles en brut et être assuré qu'ils seront compris de la même façon de l'autre coté...
 


 
Oui, mais normalement c'est possible justement de régler le problème de big/low endian, après je sais pas comment on fait.
 

Sve@r a écrit :


Ce que fait strtok_r()...


Possible, je programme pas en C :D


---------------
Perhaps you don't deserve to breathe
Reply

Marsh Posté le 25-06-2012 à 17:00:17    

Terminapor a écrit :


 
Oui, mais normalement c'est possible justement de régler le problème de big/low endian, après je sais pas comment on fait.
 


 
Un proc qui manipule des ints en little endian peut tout à fait avoir son unité de float en big endian, donc en général, oui, c'est plutôt parce que tu ne peux pas directement faire des htonl ou ntohl bêtement.


---------------
last.fm
Reply

Sujets relatifs:

Leave a Replay

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