Eingelesenen String in Zahlen aufspalten



  • Hallo, ich hab hier ne funktion, welche ein char-array bekommt und eine struktur zurückgeben soll, nur hab ich ein problem mit dem umwandeln der strings in zahlen.
    hier der code:

    complex einlesen(char eingabe[])
    {
    	complex einlese;
    	char realteil[20]={0};
    	char imagteil[20]={0};
    	int i=0, leer=0, laenge=0;
    	for(laenge=0; laenge <20; laenge++)
    	{
    		if(eingabe[laenge]=='i')
    		{
    			i=laenge+1;
    		}
    		else if(eingabe[laenge]==0)
    		{
    			leer=laenge+1;
    		}
    	}
    	if(i==0)
    	{
    		for(laenge=0; laenge <20; laenge++)
    		{
    			realteil[laenge]=eingabe[laenge];
    		}
    		einlese.imagteil=0;
    		einlese.realteil=(float)atoi(realteil[]);
    	}
    	else if(leer==0 && i!=0)
    	{
    		for(laenge=0; laenge <i-1; laenge++)
    		{
    			imagteil[laenge]=eingabe[laenge];
    		}
    		einlese.realteil=0;
    		einlese.imagteil=(float)atoi(imagteil[]);
    	}
    	else
    	{
    		for(laenge=0; laenge <leer; laenge++)
    		{
    			realteil[laenge]=eingabe[laenge];
    		}
    		for(laenge=leer; laenge <i-1; laenge++)
    		{
    			imagteil[laenge]=eingabe[laenge];
    		}
    		einlese.realteil=(float)atoi(realtei[]);
    		einlese.imagteil=(float)atoi(imagteil[]);
    	}
    	return einlese;
    }
    

    hat jmd einen plan, wie man das möglichst einfach machen kann?



  • Hallo,

    Azrael89 schrieb:

    hat jmd einen plan, wie man das möglichst einfach machen kann?

    mach doch die Eingabe so, das gleich float bzw. double Werte eingelesen werden.



  • C# Code:

    Bist du evtl. falsch hier?

    else if(eingabe[laenge]==0)

    Soll das nicht

    else if(eingabe[laenge]==32)

    heissen?

    einlese.realteil=(float)atoi(realteil[]);

    Mit atoi ignorierst du die Nachkommastellen?!

    realteil[]

    Soll das C# sein? C/C++ ist es jedenfalls nicht.

    Hast du dir das Format selbst ausgedacht? Dann wäre es sinnvoll, dies etwas auswertbarer zu gestalten.



  • stimmt, leerzeichen is ja die 32^^.
    und ja sry ich hätte [cpp] verwenden sollen

    und 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
    🙂


Anmelden zum Antworten