PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Zahlen sowohl dezimal als auch hexadezimal einlesen?



nobody0
16-06-2005, 09:41
Für kleine Programme, die ein bischen Hardware wie einene Parallelport ansprechen suche ich noch eine Möglichkeit die als Kommandozeilenoption übergebene I/O-Adresse sowohl dezimal als auch hexadezimal angeben zu können, z. B. 0x378 oder 888.
Mit atoi funktioniert es nicht.

Gibt's eine Funktion die das kann oder muß man sich etwas zusammenbauen? :confused:

Joghurt
16-06-2005, 14:04
man strtod

nobody0
16-06-2005, 16:11
Aha, danke :)

Ich hatte gehofft, etwas zu finden, mit dem es kürzer getht, also ohne cast double -> int, und ohne nicht benutzten Pointer, aber hauptsache es geht mit wenigen Zeilen :)

Edit: strtod kann nicht oktal einlesen; gibt's eine Funkition mit der das geht (zusätzlich zum hexadezimalen u. dezimalen Einlesen)? :confused:

Edit: Hier das Demo-Progrämmchen, das auch NAN, inf und 3e4 nach int konvertiert und zeigt, wie man mit errno und Pointer-Vergleich noch mehr checken kann als bei atoi:



#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
int main (int argc, char * argv[])
{
char * ptr_c = NULL;
char ** ptr_ignore = &ptr_c;
double d=strtod(argv[1], ptr_ignore);
int i=(int)d;
printf("%i %f\n", i, d);
printf("%d %p %p, argc=%d\n", errno, argv[1], ptr_c, argc);
return 0;
}

Joghurt
16-06-2005, 18:13
Oops. Ich meinte strtol! Außerdem kannst du einfach NULL als pointer übergeben!


#include <stdio.h>
#include <stdlib.h>
int main (int argc, char * argv[])
{
int i=strtol(argv[1],NULL,0);
printf("%i, %s\n", i, argv[1]);
return 0;
}Oktalzahlen sind auch kein Problem.

nobody0
16-06-2005, 18:47
Aha.
Den Pointer habe ich im Programm eingebaut für spätere Konsistenz-Checks, die auch noch errno auswerten können.

Das strtol hat aber auch Nachteile, denn strtol kann NAN, inf und 3e4 nicht einlesen. Naja, man kann halt nicht alles haben; zumindest nicht mit ein paar Code-Zeilen.

panzi
16-06-2005, 19:56
Aha.
Den Pointer habe ich im Programm eingebaut für spätere Konsistenz-Checks, die auch noch errno auswerten können.

Das strtol hat aber auch Nachteile, denn strtol kann NAN, inf und 3e4 nicht einlesen. Naja, man kann halt nicht alles haben; zumindest nicht mit ein paar Code-Zeilen.
NAN, inf und 3e4 sind auch spezielle double werte und gehn somit auch bei der konvertierung nach int verloren, weil int die nicht kennt (bzw. bei exp. darstellungen gibts u.U. nen überlauf, könnt ich mir vorstellen).

nobody0
16-06-2005, 22:22
NAN, inf und 3e4 sind auch spezielle double werte und gehn somit auch bei der konvertierung nach int verloren, weil int die nicht kennt (bzw. bei exp. darstellungen gibts u.U. nen überlauf, könnt ich mir vorstellen).

Ok, NAN und inf kann müssen bei einer int-Eingabe nicht sein, aber 3e4 ist eine Ganzzahl (30000), also eigentlich kein Problem.
Und portable ist der cast von double nach int natürlich genau genommen nur mit

int i=( ( (d) > 0. ) ? (int)((d) + 0.5) : -(int)(-(d) + 0.5) );

aufgrund der endlichen Genauigkeit der Gleitpunktzahlendarstellung. Das hatte ich zuerst vergessen.

nobody0
17-06-2005, 07:50
Übrigens ist der obige Aufruf von strtol nicht ganz korrekt; es muß


strtol(nptr,(char **)NULL,0);

heißen.