Array trennen
-
Hi, wie kann ich das folgende Array trennen?
46.0 54.0 080 264 EpbkcraDo
Das heißt, ich möchte die Werte einzeln haben, nach dem Leerzeichen getrennt. Also als Ausgabe sol da folgendes stehen
46.0
54.0
080
264
264
Wie kann ich das machen?
-
herdenmitglied schrieb:
Hi, wie kann ich das folgende Array trennen?
46.0 54.0 080 264 EpbkcraDo
Das heißt, ich möchte die Werte einzeln haben, nach dem Leerzeichen getrennt. Also als Ausgabe sol da folgendes stehen
46.0
54.0
080
264
264
Wie kann ich das machen?Indem du die Leerzeichen durch Zeilenumbrüche ersetzt.
Mal im Ernst: wenn du uns ein wenig Code zeigst und dein Problem etwas genauer beschreibst, kann dir viel besser geholfen werden. Deine Beschreibung ist recht dürftig...
-
also bis jetzte hab ich folgendes programmeirt:
unsigned char buffer[8192];
int n = read(buffer,sizeof(buffer));
if (n > 0)
{
buffer[n] = '\0';
cout << buffer << flush;
}Damit möchte ich von einer Seriellenschnittstelle datem auslesen. Das klappt auch. Und die Daten stehen jetzt buffer drin.
Als Ausgabe steht folgendes auf dem Bildschirm:
46.0 54.0 080 264 EpbkcraDo
und die einzelnen werte möchte ich jetzt nach dem leerzeichen trennen und getrennt ausgeben
nur wie mache ich das?
-
Einige Punte zur Anmerkung erstmal:
- benutz bitte die [cpp]-Tags für C/C++-Code, das machts leichter zu lesen.
- eventuell musst du bei read() von sizeof(buffer) noch 1 abziehen für die '\0' am Ende, sonst gibts Probleme wenn tatsächlich mal 8192 Zeichen gelesen werden.Zum Vorgehen wie du das char-Array zerlegen kannst:
Es gibt vermutlich C-Funktionen mit denen du einen C-String (denn das ist dein Buffer) in einzelstrings zerlegen kanns. Dein ganzer Code ist bisher C-Stil, es ist aber Entscheidungssache ob du eher C++ oder C schreiben möchtest.
In C++ würde ich den Buffer über einen string an einen stringstream geben und aus diesem in einer Schleife die einzelnen Strings auslesen (operator>> zieht strings aus einem Stream indem er bis zum nächsten Leerzeichen liest).
-
//46.0 54.0 080 264 EpbkcraDo //floatfloatint int string float a, b; int c, d; std::string e; //#include <string> std::stringstream tmp_buffer; //#include <sstream> tmp_buffer << buffer; tmp_buffer >> a >> b >> c >> d >> e;Wenn man die Leerzeichen erzwingen möchte gabs hier iwo ma was von Werner... *sucht*:
template <char C> std::istream& Char(std::istream& in) { char c; if( in >> c && c != C ) in.setstate(std::ios_base::failbit); return in; } void function() { tmp_buffer >> Char<' '> >> a >> Char<' '> >> b >> Char<' '> >> c >> Char<' '> >> d >> Char<' '> >> e; }bb
-
Erstmal danke für die schnelle hilfe.
Nur leider ist das noch nicht die Lösung für mein Problem. Wahrscheinlich habe ich mich falsch ausgedrückt.
Ich wollte nicht nach jeder zahl ein Leerzeichen, sondern dass ich hinterher da stehen habe
1.Wert: 46.0
2.Wert: 54.0
3.Wert: 080
4.Wert: 264
5.Wert: EpbkcraDoso, dass ich jetzt mit jedem Wert einzeln arbeiten kann.
-
herdenmitglied schrieb:
...so, dass ich jetzt mit jedem Wert einzeln arbeiten kann.
Aber genau das hast Du doch mit unskilleds Lösung (die ich hier ein klein wenig bearbeite):
#include <string> #include <sstream> ... float wert1, wert2; int wert3, wert4; std::string wert5; std::istringstream tmp_buffer(buffer); tmp_buffer >> wert1 >> wert2 >> wert3 >> wert4 >> wert5;Da hast Du hinterher die Werte in den Variablen wert1 - wert5 und kannst mit jeder "einzeln arbeiten".
Ich habe übrigens die Vermutung, dass Du die Daten in "buffer" bereits aus einem anderen Stream bekommst (Konsole, Datei, ...) ... da kannst Du Dir den Umweg über (tmp_)buffer sparen und gleich schreiben:
#include <string> #include <fstream> // falls Datei #include <iostream> // falls Konsole ... float wert1, wert2; int wert3, wert4; std::string wert5; // aus Datei std::ifstream in("MeineDatei.txt"); in >> wert1 >> wert2 >> wert3 >> wert4 >> wert5; // von Konsole std::cin >> wert1 >> wert2 >> wert3 >> wert4 >> wert5;Zur Info: Der operator>>() ist so gestrickt, dass er false zurückmeldet, wenn die Konvertierung in den Zieltyp nicht klappt (also z.B. "ak" -> float).
Der Stream wird danach auf "ungültig" gesetzt - und erst wieder nutzbar, indem man ihn clear()-t (löscht NICHT den Inhalt!) und ggf. ungültige zeichen entfernt (mittels ignore()).Gruß,
Simon2.