Insérer des espaces entre les chiffres en C

Comment pourrais-je prendre un nombre tel que 123456 et l’avoir imprimé au format 1 2 3 4 5 6 ?

Comme “jamesdlin” l’a mentionné dans son commentaire, l’approche de GMan fonctionnerait, mais vous devrez le stocker dans un tampon pour pouvoir imprimer dans le bon ordre (son algorithme afficherait “6 5 4 3 2 1” pour la saisie 123456). À ce stade, je dirais qu’il serait beaucoup plus simple d’utiliser simplement sprintf comme “le suggère” dans sa réponse (s’il ne s’agit bien sûr pas d’une atsortingbution de classe à un algorithme).

À mon avis, la méthode la plus simple consiste à utiliser la récursivité. Vous pouvez ainsi imprimer les chiffres dans le bon ordre sans utiliser de mémoire tampon.

L’implémentation récursive est très simple:

 void PrintfRecursivly(int number) { if (number < 0) { number *= -1; printf("- "); } if (number > 10) { PrintfRecursivly(number / 10); printf(" "); } printf("%d", number % 10); } int main() { int number = -78900456; PrintfRecursivly(number); return 0; } 

Consortingbution:

-78900456

Sortie:

  - 7 8 9 0 0 4 5 6 

EDIT : Merci à Steve Jessop qui a suggéré un algorithme correct pour les entiers positifs en mon absence. J’ai changé la méthode ci-dessus pour imprimer correctement pour toutes les entrées (positives et négatives), sans le dernier espace.

Veuillez noter que nous pouvons éviter de vérifier les valeurs négatives à chaque récursion en effectuant la vérification une seule fois (dans la fonction principale ou ailleurs), mais je ne l’ai pas écrite car nous perdrions plus de clarté que de gain de performance.

Le moyen le plus simple de procéder (bien que pas le plus rapide) serait probablement de commencer par sprintf le nombre dans une mémoire tampon de chaîne, puis de parcourir le tampon en printf un caractère et un espace à la fois.

Cela n’existe pas dans le formatage printf standard.

Une méthode courante consisterait à extraire chaque chiffre, puis à imprimer ce chiffre. Je ne vous donnerai pas le code, mais c’est la version implémentée de:

 int d; // your number /* While `d` is not zero */ /* Modulus `d` with 10 to extract the last digit */ /* Print it, with your space */ /* Divide by 10 to remove the last digit */ /* Repeat */ 

Ce sera à l’envers. Je vous laisse le soin de régler ce problème. (Conseil: dans la boucle, placez le résultat dans un tableau de caractères. Lorsque vous avez terminé, commencez par le dernier index du tableau et imprimez à l’envers.)

 char buffer[50]; int myNum = 123456; int n; int i; n = snprintf(buffer, sizeof buffer, "%d", myNum); for (i = 0; i < n; i++) { putchar(buffer[i]); putchar(' '); } putchar('\n'); 
 int number = 123456; char strNumber[64]; strNumber[0] = '\0'; sprintf_s(strNumber, "%d", number); int i = 0; while(strNumber[i] != '\0') printf("%c ", strNumber[i++]); 

Cela ne fonctionne que pour les entiers non signés:

 #include  #include  void print_number(unsigned int number) { int n = number, c = 0, p; while (n > 0) { n /= 10; c++; } for (n = c - 1; n >= 0; n--) { p = pow(10, n); printf("%d ", number / p); number -= number / p * p; } printf("\n"); } int main(int argc, char *argv[]) { print_number(1); print_number(12); print_number(123); print_number(1234); print_number(12345); print_number(1234567); print_number(12345678); print_number(123456789); return 0; } 
 #include  int main () { int a, b, c, d, e; printf("Write a number of four figures\n"); scanf("%d", &a); printf("Your number is:\n"); b = (a - (a % 1000)) / 1000; c = ((a - (a % 100)) / 100) - b * 10; d = ((a - (a % 10)) / 10) - b * 100 - c * 10; e = (a - b * 1000 - c * 100 - d * 10); printf("%d\t%d\t", b, c); printf("%d\t", d); printf("%d", e); return 0; }