Zeichenfolge in Ganzzahl konvertieren

15.03.2009
Eine ziemlich häufiges Problem bei der Anwendungsentwicklung ist die Umwandlung von Zeichenfolgen in eine Ganzzahl zur Weiterverarbeitung. Bei C oder C++ ist atoi() der einfachste Weg, um vom char array zum int zu kommen. Leider ermöglicht atoi() keine präzise Fehlererkennung, weil eine ungültige Eingabe ebenso wie die korrekte Eingabe "0" zum Ergebnis "0" führt:
 

$ cat atoi.c #include #include int main() { printf("%i - %i ", atoi("invalid"), atoi("0")); return 0; } $ gcc -Wall -pedantic atoi.c -o atoi $ ./atoi 0 - 0

 
Meist wird empfohlen, strtol() zu nutzen. Diese Funktion ist mächtiger und v.a. brauchbarer bei der Fehlererkennung. Aber wieviel Performance kostet strtol() im Vergleich zu atoi()? Ein Shell-Script bringt zusammen mit valgrind auf der Testplattform (Core 2 Duo E6600) folgende Ergebnisse:
 

Teste atoi() Test | Instruktionen | Ergebnis ----------------+-----------------+---------------- >4< | 883 | 4 >42< | 903 | 42 >4\n2< | 894 | 4 >424242< | 983 | 424242 > 42 < | 920 | 42 >answer: 42< | 867 | 0 >2147483648< | 1063 | -2147483648 >-2147483649< | 1064 | 2147483647 >\n42\n< | 920 | 42 Teste strtol() Test | Instruktionen | Ergebnis ----------------+-----------------+---------------- >4< | 921 | 4 >42< | 941 | 42 >4\n2< | 932 | 4 >424242< | 1021 | 424242 > 42 < | 958 | 42 >answer: 42< | 912 | 0 >2147483648< | 1101 | 2147483648 >-2147483649< | 1102 | -2147483649 >\n42\n< | 958 | 42

 
In den meisten Fällen wird die zusätzliche Rechenzeit wohl vernachlässigbar klein sein.

Anhänge