Πώς να μετατρέψετε μια συμβολοσειρά σε ακέραιο αριθμό στη C;

Προσπαθώ να μάθω αν υπάρχει εναλλακτικός τρόπος μετατροπής συμβολοσειράς σε ακέραιο στη C.

Στον κώδικά μου έχω τακτικά το ακόλουθο μοτίβο.

char s[] = "45";

int num = atoi(s);

Οπότε, υπάρχει καλύτερος τρόπος ή άλλος τρόπος;

Λύση

Υπάρχει το strtol το οποίο είναι καλύτερο ΙΜΟ. Επίσης, μου αρέσει το strtonum, οπότε χρησιμοποιήστε το αν το έχετε (αλλά θυμηθείτε ότι δεν είναι φορητό):

long long
     strtonum(const char *nptr, long long minval, long long maxval,
     const char **errstr);

EDIT

Μπορεί επίσης να σας ενδιαφέρουν οι strtoumax και strtoimax οι οποίες είναι τυπικές συναρτήσεις της C99. Για παράδειγμα, θα μπορούσατε να πείτε:

uintmax_t num = strtoumax(s, NULL, 10);
if (num == UINTMAX_MAX && errno == ERANGE)
    /* Could not convert. */

Τέλος πάντων, μείνετε μακριά από την atoi:

Η κλήση atoi(str) θα είναι ισοδύναμη με: &gt, (int) strtol(str, (char )NULL, 10) &gt, με τη διαφορά ότι ο χειρισμός των σφαλμάτων μπορεί να διαφέρει. Αν η τιμή δεν μπορεί να είναι αναπαρασταθεί, η συμπεριφορά είναι απροσδιόριστη**.

Σχόλια (7)

Μην χρησιμοποιείτε συναρτήσεις από την ομάδα ato.... Αυτές είναι χαλασμένες και πρακτικά άχρηστες. Μια μετρίως καλύτερη λύση θα ήταν να χρησιμοποιήσετε την sscanf, αν και ούτε αυτή είναι τέλεια.

Για τη μετατροπή συμβολοσειράς σε ακέραιο, θα πρέπει να χρησιμοποιούνται συναρτήσεις από την ομάδα strto.... Στη δική σας περίπτωση θα ήταν η συνάρτηση strtol.

Σχόλια (3)

Ναι, μπορείτε να αποθηκεύσετε τον ακέραιο αριθμό απευθείας:

int num = 45;

Αν πρέπει να αναλύσετε μια συμβολοσειρά, το atoi ή το strol θα κερδίσει το διαγωνισμό "συντομότερος κώδικας".

Σχόλια (2)