Go Down

Topic: [RESOLU]Isoler chiffre d'un nombre dans une variable? (Read 1 time) previous topic - next topic

Serialkliker

Feb 15, 2012, 08:38 pm Last Edit: Feb 16, 2012, 02:43 am by Serialkliker Reason: 1
Bonsoir  à tous,

Je cherche comment faire pour isoler un chiffre qui se trouve dans une variable, je m'explique;
si j'ai par exemple
int test = 15;

j'aimerai recuperer dans un tableau le 1 et le 5 separement.

Merci

skywodd

Bonsoir,


Je cherche comment faire pour isoler un chiffre qui se trouve dans une variable, je m'explique;
si j'ai par exemple
int test = 15;

j'aimerai recuperer dans un tableau le 1 et le 5 separement.

Sous forme de char[]ou de int[] ?

tableau de char :
Code: [Select]
int test = 15;
char str[5];
sprintf(str, "%d", test);
// str => {'1', '5', '\0', x, x}


tableau de int :
Code: [Select]
int test = 15;
int tab[3];
tab[0] = test % 10;
tab[1] = test / 10;
tab[2] = test / 100;
// tab => {unités, dizaines, centaines}
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !


Serialkliker

J'ai juste une question supplementaire sur ce que tu m'a mis tout à l'heure :
Code: [Select]
sprintf(str, "%d", test);
Je vois souvent sur des bouts de code sur internet "%02d" ou bien comme tu vient de me mettre mais à quoi sa sert exactement et comment ça s'appelle. Merci

zoroastre

#4
Feb 15, 2012, 09:42 pm Last Edit: Feb 15, 2012, 09:52 pm by zoroastre Reason: 1
Yep!

Quote
%d


Il s'agit de formatage des données de sortie (printf). En l'occurence, %d pour décimale, %02d pour decimale à deux chiffres, %s pour un string, on peut aussi positionner un point pour les chiffres aprés la virgule : %.02d, etc.

Par contre, itoa est certes moins pratique mais cependant moins gourmand que sprintf.

Ecrit rapidement :

Version itoa : 2436 bytes
Code: [Select]
int value[5] = {15, 125, 1325, 14325, 104325 };
char buff[12];


void setup() {
 Serial.begin(19200);
 delay(1000);
}

void loop() {
 
 for (int i = 0; i < 5; i++) {
   int taille = strlen(itoa(value[i], buff, 10));
   char * data = itoa(value[i], buff, 10);
   Serial.println(data);
   for (int j = 0; j < taille; j++) {
     Serial.println(data[j]);
     delay(500);
   }
   Serial.println("Next number");
 }
}


Version sprintf : 3744 bytes
Code: [Select]
int value[5] = {15, 125, 1325, 14325, 104325 };
char buff[12];

void setup() {
 Serial.begin(19200);
 delay(1000);
}

void loop() {
 
 for (int i = 0; i < 5; i++) {
   sprintf(buff, "%d", value[i]);
   for (int j = 0; j < 12; j++) {
     Serial.println(buff[j]);
     delay(500);
   }
   Serial.println("Next number");
 }
}


EDIT1 : http://www.arduino.cc/playground/Code/PrintingNumbers

@+

Zoroastre.
Gné! ;)

skywodd


Par contre, itoa est certes moins pratique mais cependant moins gourmand que sprintf.

itoa c'est sympa, mais itoa ne déclenche pas un warning lors de la compilation en cas d'erreur de format <> type de variable ;)
C'est comme pour atoi et sscanf (qui font l'inverse, string -> nombre), atoi est plus léger mais il est impossible de faire la différence entre une erreur (= -1) et le nombre -1 ;)

La légèreté ou la "sécurité" (grosse guillemets) mais pas les deux :smiley-mr-green:
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

Serialkliker

Merci beaucoup pour vos explications, c'est beaucoup plus clair maintenant :-)

Go Up