Archiv verlassen und diese Seite im Standarddesign anzeigen : Zahlen sowohl dezimal als auch hexadezimal einlesen?
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:
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;
}
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.
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.
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).
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.
Übrigens ist der obige Aufruf von strtol nicht ganz korrekt; es muß
strtol(nptr,(char **)NULL,0);
heißen.
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.