Konsolenausgabe umwandeln
-
danke erstmals, CStoll!
Habe aber gleich noch eine Frage:
Ich habe einen String mit mehreren Werten (xxxxxx.xxxxxx.xxxxxx).
Die sechs x repräsentieren jeweils die Ausgabe eines Sensors, der Punkt trennt sie. Wenn ein Sensor angeschlossen ist, erhalte ich für die ersten sechs x Ziffern, die restlichen sind 0.
Wenn ich nun diese sechs x der Reihe nach einlesen will und diese jeweils in eine Zahl umwandle und ausgebe, wie muss ich dann vorgehen? Weil mit atof(Eingabe+n) lese ich ja alles ab n ein, also auch die nachfolgenden Oen.Hoffe du kennst dich aus
-
Da müsstest du die Eingabe per strtok() zerlegen (ich hoffe mal, das Trennzeichen zwischen den Werten ist nicht der Dezimalpunkt) oder die Trennzeichen durch '\0' (Stringende-Marke) ersetzen.
-
Hole erst einmal den gesamten String von dem oder den Sensor(en) in einem ausreichend grossen char-Buffer herein. Hast du den? Dann dröselst du diesen String nach den Trennzeichen in Teilstrings auf, aus denen mit atof die gewünschten Floatzahlen zu erhalten sind. Dazu musst du die jeweiligen Teilstrings wohl noch mit dem abschliessenden Nullzeichen ergänzen. Ist etwas Kleinarbeit erforderlich.
-
Habe es nun mal mit strtok() probiert, funktioniert soweit ganz gut.
Hier der Code:char delimiter[] = ">-+";//Trennzeichen, die im String vorkommen char *ptr; ptr = strtok(data, delimiter); while(ptr != NULL) { printf("data: %s\n", ptr); ptr = strtok(NULL, delimiter); }
Nur möchte ich nur jene Werte ausgeben, die auch sinnvoll sind (also die keine 0en oder 8en beinhalten), und diese dann auch in Zahlen umwandeln.
Da aber die jeweiligen Werte durch Pointer ausgegeben werden, habe ich so meine Schwierigkeiten mit...
-
Wenn das jeweils nur eine Ziffer ist geht auch
x = *(Eingabe+n) - '0'; // oder x = Eingabe[n] -'0';
-
DirkB schrieb:
Wenn das jeweils nur eine Ziffer ist geht auch...
Nein, sind jeweils 6 Ziffern mit Dezimalpunkt bzw. sechs 0en oder 8en.
-
Die Rückgabewerte von strtok() sind Teile deiner ursprünglichen Eingabe. Und wenn du an die einzelnen Werte weitere Bedingungen stellst, mußt du sie auf Plausibilität überprüfen.
Kannst du nochmal genau erklären, was in deiner Eingabe drinstehen kann und was mit diesen Daten passieren soll? (und warum die 8 ein ungültiges Zeichen sein sollte)
-
Der String besteht aus 6 Gruppen von jeweils 6 Ziffern, die entweder durch ein - oder ein + getrennt sind. Ist nur ein Sensor angeschlossen, enthält nur die erste Gruppe Ziffern, die anderen sind entweder 0 oder 8 (anscheinend eine Eigenheit des Wandlers).
Dieser String soll getrennt werden in 6 Teile, wobei nur die Gruppen mit sinnvollen Ziffern (d.h. kein 0 oder
ausgegeben werden sollen.
-
Wenn du statt atof() die Version für Integer nimmst, werden die . nicht mit eingelesen. Das wäre dann atoi() oder besser strtol().
Du kann auch sscanf() nehmen und die Zeile auswerten.
-
Spielt es eigentlich eine Rolle für dich, ob zwischen den einzelnen Ziffernblöcken ein + oder - steht? Wenn ja, könnte es ein Problem geben, wenn strtok() das als Trennzeichen rausschmeißt.
Ansonsten mußt du halt die "kein Sensor angeschlossen"-Werte manuell herausfiltern:
ptr = strtok(data, delimiter); for( ptr=strtok(data,delimiter); ptr != NULL; ptr=strtok(NULL,delimiter) ) { printf("data: %s\n", ptr); if(strcmp(ptr,"000000")==0 || strcmp(ptr,"888888")) { printf("keine Daten\n"); continue; } int wert = atoi(ptr); ... }
(Edit: korrekte Stringkennzeichen gesetzt)
-
DirkB schrieb:
Wenn du statt atof() die Version für Integer nimmst, werden die . nicht mit eingelesen. Das wäre dann atoi() oder besser strtol().
Du kann auch sscanf() nehmen und die Zeile auswerten.
Nein, das Teilen des Strings mit strtok() passt so, es geht nur darum die einzelnen Teile dann in Zahlen umzuwandeln.
-
nein, das spielt keine Rolle, sind nur Trennzeichen!
Ich werd mir deinen Vorschalg mal anschauen, wenn es Probleme gibt, melde ich mich wieder
danke erstmals!
-
char *s="123456.654321.123456.654321.000000.888888"; while( *s ) { if( atoi(s) && atoi(s)!=888888 ) printf("\n%d",atoi(s)); else puts("nix"); s+=7; }
-
ptr = strtok(data, delimiter); for( ptr=strtok(data,delimiter); ptr != NULL; ptr=strtok(NULL,delimiter) ) { printf("data: %s\n", ptr); if(strcmp(ptr,'000000')==0 || strcmp(ptr,'888888')) { printf("keine Daten\n"); continue; } int wert = atoi(ptr); ... }
Für die Zeile 6 bekomme ich als Error-Meldung "Zu viele Zeichen in der Konstante" ??
-
Die Fehlermeldung ist korrekt.
Außerdem zerstört strtok den Ausgangsstring.
Außerdem ist strtok nicht multithreadfähig.
-
jochenb schrieb:
Für die Zeile 6 bekomme ich als Error-Meldung "Zu viele Zeichen in der Konstante" ??
Es gibt in C einen Unterschied zwischen Zeichen und String(-literalen).
Bedenke: 'Z' != "Z"
-
DirkB schrieb:
Bedenke: 'Z' != "Z"
Sorry, mein Fehler - die C++-Abstinenz macht sich wohl bemerkbar