Inhalt eines uChar Arrays filtern
-
hm?
#include <cstring> unsigned byte arr_byte[1024]; for (unsigned short n = 0; n < 1014; n += 2) { char arr_char[3]; std::strncpy(arr_char, 2, &arr_byte[n]); std::cout << arr_char << std::endl; }
-
Also in deinem Fall dann:
unsigned char buffer[1024]; int pos1 = std::min(places[0], places[1]); // kleinsten von beiden (damit kann keine negative Zahl rauskommen!) int pos2 = std::max(places[0], places[1]); // größten von beiden (damit kann keine negative Zahl rauskommen!) char* arr = new char[pos2 - pos1 + 1]; // der string soll die Differenz der beiden Punkte lang sein ... + 1 für Nullterminierung std::strncpy(arr, pos2 - pos1, &buffer[pos1]); // die Länge des Strings, ab pos1 aus buffer ... std::cout << arr << std::endl; // ausgeben delete [] arr; // freigeben ...
-
Huhu!
Hab das mal eingebaut, oben auch das include cstring, allerdings bekomm ich folgende Fehler:
error C2059: Syntaxfehler: '::' error C2059: Syntaxfehler: '::' error C2589: '(': Ungültiges Token auf der rechten Seite von '::' error C2589: '(': Ungültiges Token auf der rechten Seite von '::' error C2664: 'strncpy': Konvertierung des Parameters 2 von 'int' in 'const char *' nicht möglich Die Konvertierung eines ganzzahligen Typs in einen Zeigertyp erfordert ein reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat
-
ja sry .... brauchst noch #include <algorithm> für std::max und std::min und std::strncpy verlangt als 2. Argument den Dest-String und als 3. die Länge ... also 2. und 3. Parameter vertauschen
=>#include <cstring> #include <iostream> unsigned byte arr_byte[1024]; for (unsigned short n = 0; n < 1014; n += 2) { char arr_char[3]; std::strncpy(arr_char, &arr_byte[n], 2); std::cout << arr_char << std::endl; }und
#include <algorithm> #include <cstring> unsigned char buffer[1024]; int pos1 = std::min(places[0], places[1]); // kleinsten von beiden (damit kann keine negative Zahl rauskommen!) int pos2 = std::max(places[0], places[1]); // größten von beiden (damit kann keine negative Zahl rauskommen!) char* arr = new char[pos2 - pos1 + 1]; // der string soll die Differenz der beiden Punkte lang sein ... + 1 für Nullterminierung std::strncpy(arr, reinterpret_cast<const char*>(&buffer[pos1]), pos2 - pos1); // die Länge des Strings, ab pos1 aus buffer ... std::cout << arr << std::endl; // ausgeben delete [] arr; // freigeben ...dann sollte es aber gehen

-
Das mit den Places ist aber Unfug...
Ich würds noch eher so machen
char s[1024]; //<Data A="Blubb" A="Bla" / ><Data A="Mööp" / > size_t len = strlen(s); for ( size_t i=0, last=-1; i<len; i++ ) if ( s[i] == '"' ) { if ( last == -1 ) last = i; else { s[i] = '\0'; cout << s+last+1 << endl; last = -1; } }Man könnte sagen es wäre zu frickelig, aber man braucht keine Includes (außer für strlen und cout) und es ist relativ verständlich. Ich bin aber überzeugt davon, dass eine bessere Lösung gibt, die dann mit Strings arbeitet. "Besser" im Sinne von schöner

-
(D)Evil schrieb:
ja sry .... brauchst noch #include <algorithm> für std::max und std::min und std::strncpy verlangt als 2. Argument den Dest-String und als 3. die Länge ... also 2. und 3. Parameter vertauschen
=>#include <cstring> #include <iostream> unsigned byte arr_byte[1024]; for (unsigned short n = 0; n < 1014; n += 2) { char arr_char[3]; std::strncpy(arr_char, &arr_byte[n], 2); std::cout << arr_char << std::endl; }und
#include <algorithm> #include <cstring> unsigned char buffer[1024]; int pos1 = std::min(places[0], places[1]); // kleinsten von beiden (damit kann keine negative Zahl rauskommen!) int pos2 = std::max(places[0], places[1]); // größten von beiden (damit kann keine negative Zahl rauskommen!) char* arr = new char[pos2 - pos1 + 1]; // der string soll die Differenz der beiden Punkte lang sein ... + 1 für Nullterminierung std::strncpy(arr, &buffer[pos1], pos2 - pos1); // die Länge des Strings, ab pos1 aus buffer ... std::cout << arr << std::endl; // ausgeben delete [] arr; // freigeben ...dann sollte es aber gehen

Ich bekomm immernoch die gleichen Fehler bis auf:
error C2664: 'strncpy': Konvertierung des Parameters 2 von 'unsigned char *__w64 ' in 'const char *' nicht möglichUnd.. brauch ich denn beides oder reicht das untere?
Coke
-
hmm das obere ist ein generelles Beispiel und ads untere brauchst du ... macht genau das was du willst ... muss halt nur was anderes damit machen als(wie im Beispiel) nur mit std::cout << ... << std::endl; auszugeben

-
Hmmm... Fehler sind immernoch da

Nur der letzte hat sich in:error C2664: 'strncpy': Konvertierung des Parameters 2 von 'unsigned char *__w64 ' in 'const char *' nicht möglichgeändert
-
Du könntest den entsprechenden Parameter casten
-
Jap, das ist glaub ich nicht ganz das Prob.
Nur anscheinded fehlt immernoch ein include, da die alten Fehler auch noch da sind.
-
Dann hast du wohl keinen C++-Compiler genutzt. Sind namespaces und somit teil des C++-Standards ...
edit
geht in dem Fall aber auch in C ...
-
Hya !

#define PROGGINGMANIAS_BLAH_BLUBB_EXTRACTOR main() // V 0.81 beta ;-) #include <iostream> #include <vector> #include <string> using namespace std; // Proggingmanias blahs and blubss extractor Version 0.81 beta int PROGGINGMANIAS_BLAH_BLUBB_EXTRACTOR { // Testblubb Buffer char blubberbuff[1024] = "<Data A=\"Blubb\" A=\"Bla\" / ><Data A=\"Mööp\" / >"; int pos1 = 0, pos2 = 0; string copy = blubberbuff; // Blahs and blubbs copy vector <string> blahs_and_blubbs; // Blahs and blubbs container while(1) { pos1 = copy.find( "\"", pos2 + 1 ); if( pos1 == -1 ) { break; } pos2 = copy.find( "\"", pos1 + 1 ); if ( pos2 == -1 ) { cout << "Error in Token: " << copy << ". Missing: \"" << endl; break; } blahs_and_blubbs.push_back( copy.substr( pos1+1, pos2 - pos1 - 1 )); } // Show the blahs and blubbs ! if ( blahs_and_blubbs.size() == 0 ) { cout << "Sorry, but there are no blahs and no blubbs available !" << endl; return 0; } cout << "Showing blahs: ( and blubbs ) " << endl; for ( int i = 0; i < blahs_and_blubbs.size(); i++ ) { cout << blahs_and_blubbs.at(i) << endl; } return 0; }Bya !
