Comment détecter la longueur d'un entier? dans le cas où j'ai eu le: int test (234567545);
comment puis-je savoir combien de temps l'int est? comme me dire il y a 9 chiffres à l'intérieur ???
j'ai essayé :
char buffer_length[100];
// assign directly to a string.
sprintf(buffer_length, "%d\n", 234567545);
string sf = buffer_length;
cout <<sf.length()-1 << endl;
mais il y aurait la plupart du temps une façon plus simple de le faire ou plus propre ...
Que diriez-vous de la division:
int length = 1;
int x = 234567545;
while ( x /= 10 )
length++;
ou utilisez la méthode log10
de <math.h>
.
Note que log10
renvoie une double
, vous devrez donc ajuster le résultat.
Faire une fonction:
int count_numbers ( int num) {
int count =0;
while (num !=0) {
count++;
num/=10;
}
return count;
}
Personne ne semble avoir mentionné le convertir en chaîne, puis obtenir la longueur. Je ne sais pas à quel point c'est performant, mais ça le fait en une seule ligne de code :)
int num = 123456;
int len = to_string(num).length();
cout << "LENGTH of " << num << " is " << len << endl;
// prints "LENGTH of 123456 is 6"
si "i" est le nombre entier, alors
int len ;
char buf[33] ;
itoa (i, buf, 10) ; // or maybe 16 if you want base-16 ?
len = strlen(buf) ;
if(i < 0)
len-- ; // maybe if you don't want to include "-" in length ?
Vous pouvez utiliser stringstream
pour cela comme indiqué ci-dessous
stringstream ss;
int i = 234567545;
ss << i;
cout << ss.str().size() << endl;
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
int i=2384995;
char buf[100];
itoa(i, buf, 10); // 10 is the base decimal
printf("Lenght: %d\n", strlen(buf));
return 0;
}
Attention, itoa n'est pas une fonction standard, même si elle est supportée par de nombreux compilateurs.
sur Internet, il est courant de commettre l'erreur d'initialiser la variable compteur à 0, puis de saisir un test de boucle de condition préalable tant que le nombre n'est pas égal à 0. Une boucle do-while est parfaite pour éviter cela.
unsigned udc(unsigned u) //unsigned digit count
{
unsigned c = 0;
do
++c;
while ((u /= 10) != 0);
return c;
}
il est probablement moins coûteux de vérifier si u est inférieur à 10 pour éviter les divisions inutiles, les incréments et les instructions cmp dans les cas où u < 10 .
mais en ce qui concerne l'optimisation, vous pouvez simplement tester u contre des puissances constantes de dix .
unsigned udc(unsigned u) //unsigned digit count
{
if (u < 10) return 1;
if (u < 100) return 2;
if (u < 1000) return 3;
//...
return 0; //number was not supported
}
ce qui vous évite 3 instructions par chiffre, mais est moins adaptable à différentes bases en plus d’être moins attrayant et fastidieux d’écrire à la main, auquel cas vous préféreriez écrire une routine pour écrire la routine avant de l’insérer dans votre programme. parce que C ne prend en charge que les nombres très finis, 64 bits , 32 bits , 16 bits , 8 bits , vous pouvez simplement vous limiter au maximum lors de la génération de la routine pour profiter à toutes les tailles.
pour prendre en compte les nombres négatifs, vous devez simplement nier u si u < 0 avant de compter le nombre de chiffres. bien sûr, tout d’abord, en prenant en charge la routine/ signée nombres.
si vous savez que u < 1000 , .__, il est probablement plus facile d'écrire au lieu d'écrire la routine.
if (u > 99) len = 3;
else
if (u > 9) len = 2;
else len = 1;