Converti Char * in Int in C

Jinku Hu 12 ottobre 2023
  1. Usa la funzione strtol per convertire char* in int in C
  2. Verificare correttamente i risultati della funzione strtol per convertire char* in int in C
Converti Char * in Int in C

Questo articolo spiegherà diversi metodi su come convertire char* in int in C.

Usa la funzione strtol per convertire char* in int in C

La funzione strtol fa parte della libreria standard C, e può convertire i dati char* in un valore intero lungo come specificato dall’utente. La funzione accetta 3 argomenti, il primo dei quali è il puntatore in cui si trova la stringa. Nota che questo argomento del puntatore char non viene modificato e ha un qualificatore const. Il secondo argomento può essere utilizzato per memorizzare il primo carattere non valido riscontrato o l’intera stringa nel caso in cui non siano state trovate cifre. Il terzo argomento specifica la base del numero da convertire e il valore di questo argomento dovrebbe essere compreso tra 2 e 36. L’esempio seguente mostra come convertire gli elementi da un array char* in numeri interi e inviarli alla 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);
}

Produzione:

12 |   33 |   43 |   23 |   90 |

In alternativa, si possono prendere gli argomenti del programma come stringhe di input e convertirli in tipi interi. Nota che dobbiamo usare int argc, char* argv[] come parametri della funzione main per accedere agli argomenti del programma ed elaborarli. Il codice di esempio successivo controlla se l’utente ha fornito almeno il singolo argomento al programma e, in caso contrario, esce visualizzando il messaggio di errore corrispondente.

#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);
}

Verificare correttamente i risultati della funzione strtol per convertire char* in int in C

Anche se abbiamo usato con successo la chiamata strtol per convertire le stringhe passate come argomenti del programma in interi nell’esempio precedente, c’è una grande possibilità che il programma dato fallisca. Si raccomanda di implementare le routine di controllo degli errori per la chiamata alla funzione strtol per garantire un’esecuzione robusta del programma con la registrazione degli errori corrispondente. Verificheremo se il numero intero convertito è compreso nell’intervallo di tipo long e se la conversione stessa non è andata a buon fine. Inoltre, controlleremo se ci sono caratteri dopo il numero intero valido e se l’input fornito è un numero decimale. Attenzione però, in ogni caso stamperemo i messaggi di errore sullo stream stderr e non termineremo il programma, ma dovresti considerare un’altra routine di gestione basata sulle tue esigenze.

#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);
}
Autore: 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

Articolo correlato - C Integer