Eingelesenen String in Zahlen aufspalten
-
stimmt, leerzeichen is ja die 32^^.
und ja sry ich hätte [cpp] verwenden sollenund was die einlese angeht, is das so, dass ich einen string der form "5 6i" einlesen will, also eine komplexe zahl. da man nicht weiß, wie groß die sind könnte es auch "2567723 72345i" heißen, ergo geht direkt als zwei floatwerte einlesen nicht.
float hab ich auch deshalb gewählt, weil bei division kommazahlen rauskommen, eingelesen werden nur ganze(bis jetzt).mir ging es eigentlich um
einlese.realteil=(float)atoi(realtei[]);
weil ich damit den realteil der zahl der passenden struktur übertragen will. ich kenne atoi auch nur als funktion, um einzelne chars aus einem array in integerzahlen umzuwandeln. so funzt der befehl nämlich nicht, man bekommt nen error. die frage ist, geht das überhaupt iwie, ein ganzes chararray in ne integerzahl umzuwandeln und was noch wichtig wäre, hört so eine funktion dann auch beim letzten zeichen auf und überträgt nicht noch leere felder als nullen oder so?
-
definiert ist:
double atof(const char*);
sie überliest beginnende Leerzeichen und hört beim 1. nicht zu double passenden Zeichen auf.
möglich für dich wäre also einfach:
double r,i; r=atof(eingabe); i=atof(strchr(eingabe,' ')?strchr(eingabe,' '):""); printf("%.0lf %.0lfi\n",r,i);
wenn du dich auf ein konstantes Format mit immer vorhandenem Real-Imaginärteil festlegen würdest, könntest du dir die atoi/atof Problematik sparen und direkt mit sscanf arbeiten, die ist nämlich genau für diesen Zweck da, z.B.
if( 2==sscanf(eingabe,"%lf %lfi",&r,&i) ) printf("%.0lf %.0lfi\n",r,i);
-
aha, und was genau macht
i=atof(strchr(eingabe,' ')?strchr(eingabe,' '):""); ?
es durchsucht die eingabe nach dem leerzeichen und dann?edit: es funktioniert jedenfalls bestens. hab nur noch spezialfälle für eingaben wie: "5 i" "i" "-i" "5" bauen müssen, aber das sind ja nur kurze if-abfragen.
ein dickes Dankeschön an Wutz
-
strchr(eingabe,' ') sucht ab eingabe nach dem 1.Vorkommen vom Zeichen ' ' und gibt einen Zeiger darauf zurück; falls kein ' ' vorkommt, wird NULL rückgegeben.
vergessen habe ich noch den Fall, dass eingabe bereits führende Leerzeichen besitzt; dafür einfach vorab:
while( *eingabe==' ' ) ++eingabe;besser noch wäre hier aber strtod aus stdlib.h:
double r,i=0; char x[]="5i"; char *e; if( 0!=(r=strtod(x,&e)) ) { if(*e=='i') i=r,r=0; else i=strtod(e,&e); } printf("%f %fi\n",r,i);
Damit klappts auch ohne Sonderbehandlung führender Leerzeichen und bei fehlendem Realteil.
Beachten solltest du noch, dass das deutsche Komma ',' bei Auftreten extrabehandelt werden muss.
-
was ist mit tabulatoren, wie sieht es mit char x[]="0i"; aus, etc, etc. ...
-
Tabs werden hier wie Leerzeichen behandelt,
"0i" wird zu i==0.0, was doch wohl beabsichtigt ist.
-
und wenn ein buchstabe ( oder ein anderes nicht-zahl-zeichen ) eingegeben wird? egal, ob zufällig oder beabsichtigt. dann hast du deine imaginäre zahl
-
für den fall, dass es nur imaginärteil gibt oder dieser auch nur "i" oder "-i" ist, reicht ja eine ganz kurze if-abfrage.
aber wenn man natürlich alle möglichen dummheiten, wie mehrere kommas, leerzeichen oder irgendnen geschreibsel abdecken will, kann man die fehlersuche ja gleich aus der einlese in ne neue ca 2 seiten lange funktion packen
da das ganze ja kein zu kaufendes programm ist, sondern mir nur den umgang mit programmen aus mehr als einer funktion usw näher bringen sollte(bis auf den einen befehl eh schon bekannt, da wusst ich das mit dem leerzeichen nicht), wird sich mein prof schon damit zufrieden geben ^^
char x[]="0i" speichert ja 0 als imaginärteil und gibt daher einfach 0 aus, bzw ist eine 0 als char ja keine 0 als zahl
-
Ja genau.
Nur wenn ein 'i' existiert, wird der vorherliegende Dezimalwert als Imaginärteil zugewiesen, normalerweise ungleich 0.
Ist ein nicht-'i'-Zeichen vorhanden, wird die Auswertung hier abgebrochen und der bisherige Wert zum Realteil.
-
da haben wir ja nochmal glück gehabt, dann ist ja alles gut