Fonction pour supprimer un element d'une chaine de caractère

Bonjour, je cherche à convertir une valeur à 5 chiffres après la virgule comprise dans une chaine de caractères en une string sans la virgule.

Etc 04950.22435 que j'aimerai obtenir sous la forme 495022435.

Existe-il une fonction qui permet cette suppression ? J'ai déjà essayer la conversion par atof :

temp =100000*(atof(latitude));
  Serial3.println(temp);

Qui ne marche pas par manque de précision.

L'idée serait soit de supprimer le point et concatener les 2 bouts restant mais je ne voit plus trop comment faire.

Help please merci, Vincent

Plusieurs options ...

tu prends un à un les chiffres que tu concatènes dans une chaîne (sauf si c'est un point)

Tu coupes ta chaîne a.b en 2 : int(a.b) te donne a et int(10000.(a.b -a)) te donne b ... Itoa et c'est joué

Nickel, merci pour l'astuce !

Ou utiliser strtok() : http://www.cplusplus.com/reference/cstring/strtok/

La c'était un cas simple, donc les "astuces mathématiques" fonctionne bien. Maintenant si tu dois splitter 2654.564594.4488.4962 les ça sera pas la même chose

Oui, je comprend, pour l’instant je cherche juste à aller à l’essentiel et la simplicité.

J’ai une autre question, j’ai une string en binaire que j’aimerai convertir en int. Vois-tu des fonctions existantes qui permettent des opérations de conversion sur les string ?

Exemple

String generate_AIS(String trame_bin){
  char *LUT="0123456789:;<=>?@ABCDEFGIJKLMNOPQRSTUVW`abcdefghijklmnopqrtstuvw";
  int n = 0;
//  int index;
  char temp_char;
  String temp_string;
  for (n=0;n<27;n++){
    temp_string = trame_bin.substring(( n*6),((n*6)+6));
    Serial3.println(temp_string);
    String index = String(temp_string,DEC);
    Serial3.println(index);
    temp_char = LUT[index];
    Serial3.println(temp_char);
  }
//  return temp_string;
}

J’ai en entrée ma chaine binaire, et je voudrais tout les 6 bits sortir le caractère correspondant dans ma LUT. Mais la conversion de l’temp_string a mon index n’est pas possible, penses-tu qu’un toInt() pourrais marcher, ou alors d’abord convertir la string en un array de char puis utiliser atoi() ?

Merci, Vincent

Oula j’ai pas tout pigé … Par exemple si je prends ta chaîne dans ton code :
“0123456789:;<=>?@ABCDEFGIJKLMNOPQRSTUVW`abcdefghijklmnopqrtstuvw”
Et que tu reçois 3, 11, et 18, tu veux obtenir une chaine : “2:A” ?

Si c’est bien ça je vois pas le problème :

char DecToLUT(byte Data) {
char LUT[]="0123456789:;<=>?@ABCDEFGIJKLMNOPQRSTUVW`abcdefghijklmnopqrtstuvw";
return LUT[Data];
}

Sinon : bannir les String, c’est un piège à con et on se débrouille très bien avec des tableaux de char :wink:

Non pas tout à fait, en fait je découpe ma chaine binaire tout les 6 bits, j’obtiens par exemple 001101, et je veux récupérer la valeur correspondante a LUT[13], “<”.

Ensuite je concetane toutes les symbole en une trame qui me donnera la trame AIS. Suis-je clair ??:slight_smile:

[Edit] Oui enfin tu as compris le principe sauf que je recois une valeur binaire que je n’arrive pas a convertir en décimale, sachant que cette valeur binaire est comprise dans une string ou un tableau de char.

Ok alors y'a un truc que t'as pas compris : que tu travailles en décimal, float long, binaire ... Derrière c'est toujours du binaire.

Concrètement :

int Var1 = 16;

Exactement pareil que :

int Var1 = 0b10000;

Dans la mémoire ça sera toujours stocké 10000.

Mais ton binaire est sous forme de string ou directement en binaire ?

Oui j'ai a peu près cernéle truc .Sous forme de string quand elle arrive dans la fonction.

Perso j'aurais fait ça : récupérer la position du point avec strpos, puis lire les (strpos - 1) caractères de gauche, puis les (len - strpos) caractères de droite. Si c'est un tableau de char, on peut facilement décaler le contenu en écrasant le tableau sur lui-même (il aura 2 zéros terminaux, c'est pas trop grave).

Oui du coup j’ai utilisé la fonction substring pour isoler les 2 parties puis un strcat ensuite.

Sur le coup pour traduire ma string binaire j’ai essayer de monter une petite boucle pour calculer ça mathematiquement parlant:

String generate_AIS(String trame_bin){
  char *LUT="0123456789:;<=>?@ABCDEFGIJKLMNOPQRSTUVW`abcdefghijklmnopqrtstuvw";  //table de correspondance
  char temp_char_bin[7];                                            
  int n = 0;
  int o;
  int index = 0;
  char temp_char;
  String temp_string;
  for (n=0;n<27;n++){
    temp_string = trame_bin.substring(( n*6),((n*6)+6));            //prend 6bits par 6bits
    temp_string.toCharArray(temp_char_bin,7);                          //transforme la string en tableau de char
    for (o = 5;o >=0;o--){                                                    // calcul de l'index
      index =  index + (temp_char_bin[o]*bit(o));
    }
    temp_char = LUT[index];                                                //récupération du symbol par rapport a la valeur des 6 bits
    index = 0;
    Serial3.println(temp_char);
  }
//  return temp_string;
}

Bizzarement le (temp_char_bin[o]*bit(o)) me donne la bonne valeur *48…

48 est le code ascii de '0', ce qui me semble logique.

Si tu veux convertir une string de ‘1’ et de ‘0’ :

byte BinStrToDec(char MonTableau[]) {

byte result=0;

for(int i=0;i<6;i++) {
result |= (MonTableau[i]-'0')<<(5-i);
}

return result;
}

Oui, j’ai trafiquer un peu ça, ne m’en voulez pas cest mon tout premier programme, cela ne doit pas être beau a voir :*

char* generate_AIS(String trame_bin){
  char *LUT="0123456789:;<=>?@ABCDEFGIJKLMNOPQRSTUVW`abcdefghijklmnopqrtstuvw";  //table de correspondance
  char temp_char_bin[7];                                            //
  int n = 0;
  int o;
  long int index = 0;
  char temp_char;
  String temp_string;
  char final_string[27];
  strcpy (final_string, "1");
  for (n=0;n<27;n++){
    temp_string = trame_bin.substring(( n*6),((n*6)+6));            //prend 6bits par 6bits
    temp_string.toCharArray(temp_char_bin,7);                       //transforme la string en tableau de char
    for (o = 5;o>=0;o--){
      index =  index + (((temp_char_bin[o]-48)*bit(abs(o-5))));
    }
    final_string[n] = LUT[index];
    index = 0;
  }
  final_string[27] = 0;
//  Serial3.println(final_string);
  return (final_string);
}

Merci à vous pour les conseils.

Vincent