Frage

Was ist der Unterschied zwischen atol () & strtol ()?

Nach ihrem Mann Seiten, scheinen sie die gleiche Wirkung haben wie auch passende Argumente:

long atol(const char *nptr);

long int strtol(const char *nptr, char **endptr, int base);

In einem verallgemeinerten Fall, wenn ich das base Argument nicht verwenden will (ich habe nur Dezimalzahlen), die Funktion soll ich verwenden?

War es hilfreich?

Lösung

strtol bietet Ihnen mehr Flexibilität, da es Ihnen eigentlich sagen kann, wenn die gesamte Zeichenfolge in eine ganze Zahl oder nicht umgewandelt wurde. atol, wenn nicht in der Lage die Zeichenfolge in eine Zahl umgewandelt werden (wie in atol("help")), 0 zurück, das ist nicht von atol("0"):

int main()
{
  int res_help = atol("help");
  int res_zero = atol("0");

  printf("Got from help: %d, from zero: %d\n", res_help, res_zero);
  return 0;
}

Ausgänge:

Got from help: 0, from zero: 0

strtol angeben wird, sein endptr Argument, in dem die Konvertierung fehlgeschlagen.

int main()
{
  char* end;
  int res_help = strtol("help", &end, 10);

  if (!*end)
    printf("Converted successfully\n");
  else
    printf("Conversion error, non-convertible part: %s", end);

  return 0;
}

Ausgänge:

Conversion error, non-convertible part: help

Daher ist für jede ernsthafte Programmierung, empfehle ich auf jeden Fall strtol verwenden. Es ist ein wenig komplizierter zu bedienen, aber das hat einen guten Grund, wie ich oben beschrieben.

atol kann nur für sehr einfache und kontrollierten Fälle geeignet sein.

Andere Tipps

atol Funktionalität ist eine Teilmenge von strtol Funktionalität, mit der Ausnahme, dass atol Sie liefert keine brauchbare Fehlerbehandlung Fähigkeiten. Das prominenteste Problem mit ato... Funktionen ist, dass sie nicht definiertes Verhalten bei Überlauf führen. Hinweis: Dies ist nicht nur ein Mangel an informativen Feedback im Falle eines Fehlers, das ist nicht definiertes Verhalten , das heißt im Allgemeinen ein nicht behebbarer Fehler

.

Das bedeutet, dass atol Funktion (wie auch alle anderen Funktionen ato..) ziemlich nutzlos für schwerwiegende praktische Zwecke ist. Es war ein Design-Fehler und sein Platz auf dem Schrottplatz der C Geschichte. Sie sollten Funktionen von strto... Gruppe verwenden, um die Konvertierungen durchführen. Sie wurden eingeführt, unter anderem die inhärenten Probleme Funktionen ato... Gruppe zu korrigieren.

Nach dem atoi Manpage wird von strtol veraltet.

IMPLEMENTATION NOTES
The atoi() and atoi_l() functions have been deprecated by strtol() and strtol_l() 
and should not be used in new code.

Im neuen Code würde ich immer strtol verwenden. Es hat die Fehlerbehandlung und die endptr Argument können Sie sehen, welcher Teil der Zeichenfolge verwendet wurde.

Der C99-Standard ist über die ato* Funktionen:

Mit Ausnahme des Verhaltens auf Fehler, sie äquivalent zu

atoi: (int)strtol(nptr,(char **)NULL, 10)
atol: strtol(nptr,(char **)NULL, 10)
atoll: strtoll(nptr, (char **)NULL, 10)

atol(str) entspricht

strtol(str, (char **)NULL, 10);

Verwenden strtol, wenn Sie das Ende Zeiger (zu prüfen, ob es mehr Zeichen zu lesen oder wenn in der Tat haben Sie überhaupt lesen) wollen oder eine andere Base als 10. Ansonsten ist atol in Ordnung.

Wenn der Speicher dient, strtol() hat den zusätzlichen Vorteil, die (optional) endptr Punkt auf das erste Zeichen zu setzen, die nicht konvertiert werden können. Wenn NULL, wird es ignoriert. Auf diese Weise, wenn Sie einen String mit Zahlen und Zeichen gemischt sind Verarbeitung, könnte man fortsetzen.

z. B.

char buf[] = "213982 and the rest";
char *theRest;
long int num = strtol(buf, &theRest, 10);
printf("%ld\n", num);    /* 213982 */
printf("%s\n", theRest); /* " and the rest" */

Der Mann Seite von strtol gibt die folgende:

ERRORS
   EINVAL (not in C99) The given base contains an unsupported value.
   ERANGE The resulting value was out of range.
   The implementation may also set errno to EINVAL in case no conversion was performed (no digits seen, and 0 returned).

Der folgende Code überprüft Bereichsfehler. (Modified Elis Code ein bisschen)

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

int main()
{
   errno = 0;
   char* end = 0;
   long res = strtol("83459299999999999K997", &end, 10);

   if(errno != 0)
   {
      printf("Conversion error, %s\n", strerror(errno));
   }
   else if (*end)
   {
      printf("Converted partially: %i, non-convertible part: %s\n", res, end);
   }
   else
   {
      printf("Converted successfully: %i\n", res);
   }

   return 0;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top