Comment imprimer un tableau de caractères dans l’ordre inverse du programme C

#include  #include  #define SIZE 25 int main (void) { int d, b, c; printf(" Enter an integer and press 'enter':\n"); scanf("%d" , &d); printf(" Enter the desired base and press 'enter':\n"); scanf("%d" , &b); if (b < 2) { printf(" Your base is to low! \n") } else { while (d != 0) { int radix; radix = d % b; d = d / b; char basechars[] = "0123456789ABCDEF"; printf("%c" , basechards[radix]); } } return 0; } 

Ce programme invite l’utilisateur à entrer une décimale et une base à convertir cette décimale en base choisie. La conversion est toutefois imprimée dans l’ordre inverse et j’en ai besoin pour imprimer régulièrement. Exemple: Entré: 112, puis 16, le résultat est 07 plutôt que 70.

Vous pouvez stocker chaque chiffre dans un tableau:

 } else { char arr[32]; int counter = 0; while (d != 0) { int radix; radix = d % b; d = d / b; char basechars[] = "0123456789ABCDEF"; arr[counter++] = basechars[radix]; } if (counter == 0) arr[counter++] = '0'; arr[counter++] = '\0'; print_rev(arr); printf("\n"); } 

puis imprimez la chaîne en utilisant une fonction récursive (elle inversera la sortie):

 void print_rev(const char *s) { if (*s) { print_rev(s + 1); printf("%c", *s); } } 

ou directement:

 } else { char arr[32]; int counter = 0; while (d != 0) { int radix; radix = d % b; d = d / b; char basechars[] = "0123456789ABCDEF"; arr[counter++] = basechars[radix]; } if (counter == 0) { printf("0"); else { while (counter--) printf("%c", arr[counter]); } printf("\n"); } 
  1. Inverser le tableau est le moyen le plus simple.
  2. Utilisez la macro limit.h LONG_BIT pour connaître le nombre maximum de caractères à stocker. Cela redimensionne votre tableau.
  3. Je vérifie également la base pour la limite supérieure de 16.
  4. Construisez le tableau, puis imprimez-le. Notez qu’il gère très bien 0.
  5. Vous avez également oublié les nombres négatifs.

     } else if (b > 16) { printf(" Your base is too high! \n"); } else { const char basechars[] = "0123456789ABCDEF"; char arr[LONG_BIT]; // d is an integer, so LONG_BIT holds // enough characters for a binary representation. int counter = 0; int negative_flag = 0; if (d < 0) { d = -d; negative_flag = 1; } do { int digit = d % b; d = d / b; arr[counter++] = basechars[digit]; } while (d != 0); if (negative_flag) { printf ("-"); } while (counter--) { printf ("%c", arr[counter]); } printf ("\n"); } 

Cette version effectue une allocation de mémoire dynamic afin que vous n’ayez pas à spécifier combien de temps la chaîne convertie doit être au préalable.

Les nombres peuvent être aussi gros que vous le souhaitez, ce qui est particulièrement important dans la conversion binary. J’ai également mis un chèque pour la base 16, qui est la limite supérieure.

 int main (void) { int d, b, c, i = 1; char *converted = malloc(i); printf(" Enter an integer and press 'enter':\n"); scanf("%d" , &d); printf(" Enter the desired base and press 'enter':\n"); scanf("%d" , &b); if (b < 2) { printf(" Your base is to low! \n"); return 1; } else if (b > 16) { printf(" Your base is to high! \n"); return 1; } else { while (d != 0) { int radix; radix = d % b; d = d / b; char basechars[] = "0123456789ABCDEF"; converted = realloc(converted, i++); *(converted +i - 1) = basechars[radix]; } } i--; while(i != 0) { printf("%c", converted[i]); --i; } free(converted); printf("\n"); return 0; } 

Offrir une approche récursive.

Déterminez si des chars supplémentaires doivent être imprimés à partir des chiffres les plus significatifs, appelez la fonction d’assistance de manière récursive, puis imprimez le chiffre le moins significatif.

Le code doit prendre soin de gérer “0” comme une entrée valide. Ce qui suit utilise des valeurs négatives pour bien gérer INT_MIN .

 static void PrintDigits(int x, int base) { static const char basechars[] = "0123456789ABCDEF"; if (x <= -base) { PrintDigits(x/base, base); } putchar(basechars[-(x%base)]); } void PrintInt(int x, int base) { if (base < 2 || base > 16) { printf(" Your base is out of range! \n"); } else { if (x < 0) putchar('-'); else x = -x; PrintDigits(x, base); } putchar('\n'); } int main(void) { PrintInt(65535, 16); PrintInt(65535, 10); PrintInt(65535, 2); PrintInt(INT_MAX, 10); PrintInt(0, 10); PrintInt(-1, 16); PrintInt(INT_MIN, 10); int d, b; printf(" Enter an integer and press 'enter':\n"); scanf("%d" , &d); printf(" Enter the desired base and press 'enter':\n"); scanf("%d" , &b); PrintInt(d, b); return 0; } 

FFFF
65535
1111111111111111
2147483647
0
-1
-2147483648

Même avec la base 2, la profondeur de récursivité ne serait pas supérieure à la largeur de bit de int .