Convertir Char* en Int en C

Jinku Hu 12 octobre 2023
  1. Utiliser la fonction strtol pour convertir char* en int en C
  2. Vérifier correctement les résultats de la fonction strtol pour convertir char* en int en C
Convertir Char* en Int en C

Cet article explique plusieurs méthodes de conversion de char* en int en C.

Utiliser la fonction strtol pour convertir char* en int en C

La fonction strtol fait partie de la bibliothèque standard du C, et elle peut convertir des données char* en valeurs entières longues comme spécifié par l’utilisateur. La fonction prend 3 arguments, dont le premier est le pointeur où se trouve la chaîne de caractères. Notez que l’argument du pointeur char n’est pas modifié et possède un qualificatif const. Le second argument peut être utilisé pour stocker le premier caractère invalide rencontré ou la chaîne entière dans le cas où aucun chiffre n’a été trouvé. Le troisième argument spécifie la base du nombre à convertir, et la valeur de cet argument doit être comprise entre 2 et 36. L’exemple suivant montre comment convertir des éléments d’un tableau char * en nombres entiers et les sortir sur la console.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void printIntegers(long int arr[], size_t size) {
  for (size_t i = 0; i < size; i++) printf("%4ld | ", arr[i]);
  printf("\n");
}

int main(int argc, char *argv[]) {
  char *arr[] = {"12", "33", "43", "23", "90"};

  size_t len = sizeof arr / sizeof arr[0];
  long int arr3[len];
  for (int i = 0; i < len; ++i) {
    arr3[i] = strtol(arr[i], NULL, 10);
  }
  printIntegers(arr3, len);

  exit(EXIT_SUCCESS);
}

Production :

12 |   33 |   43 |   23 |   90 |

Comme alternative, on peut prendre les arguments du programme comme chaînes d’entrée et les convertir en types d’entiers. Notez que nous devons utiliser int argc, char* argv[] comme paramètres de la fonction main pour accéder aux arguments du programme et les traiter. L’exemple de code suivant vérifie si l’utilisateur a fourni au moins l’unique argument au programme et, si ce n’est pas le cas, quitte en affichant le message d’erreur correspondant.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void printIntegers(long int arr[], size_t size) {
  for (size_t i = 0; i < size; i++) printf("%4ld | ", arr[i]);
  printf("\n");
}

int main(int argc, char *argv[]) {
  if (argc < 2) {
    printf("Usage: ./%s int1 int2 int3...\n", argv[0]);
    exit(EXIT_FAILURE);
  }

  long int arr2[argc - 1];
  for (int i = 0; i < argc - 1; ++i) {
    arr2[i] = strtol(argv[i + 1], NULL, 10);
  }
  printIntegers(arr2, argc - 1);

  exit(EXIT_SUCCESS);
}

Vérifier correctement les résultats de la fonction strtol pour convertir char* en int en C

Même si nous avons utilisé avec succès l’appel strtol pour convertir des chaînes de caractères passées comme arguments de programme en entiers dans l’exemple précédent, il y a de grandes chances que le programme donné échoue. Il est recommandé d’implémenter les routines de vérification d’erreur pour l’appel de fonction strtol afin de garantir une exécution robuste du programme avec un enregistrement des erreurs correspondant. Nous allons vérifier si l’entier converti est dans la plage du type long et si la conversion elle-même a échoué. En outre, nous vérifierons s’il y a des caractères après l’entier valide et si l’entrée donnée est un nombre décimal. Attention cependant, nous imprimerons les messages d’erreur dans le flux stderr dans chaque cas et ne mettrons pas fin au programme, mais vous devriez envisager une autre routine de traitement en fonction de vos besoins.

#include <errno.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void printIntegers(long int arr[], size_t size) {
  for (size_t i = 0; i < size; i++) printf("%4ld | ", arr[i]);
  printf("\n");
}

int main(int argc, char *argv[]) {
  if (argc < 2) {
    printf("Usage: ./%s int1 int2 int3...\n", argv[0]);
    exit(EXIT_FAILURE);
  }

  long int num;
  char *endptr, *str = argv[1];
  errno = 0;
  long ret = strtol(str, &endptr, 10);

  if (str == endptr) {
    fprintf(stderr, "%s: not a decimal number\n", str);
  } else if ('\0' != *endptr) {
    fprintf(stderr, "%s: extra characters at end of input: %s\n", str, endptr);
  } else if ((LONG_MIN == ret || LONG_MAX == ret) && ERANGE == errno) {
    fprintf(stderr, "%s out of range of type long\n", str);
  } else if (errno != 0 && ret == 0) {
    fprintf(stderr, "%s no conversion was performed\n", str);
  } else {
    num = ret;
    printf("num: %ld\n", num);
  }

  exit(EXIT_SUCCESS);
}
Auteur: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Article connexe - C Integer