Konsolenausgabe umwandeln
-
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