C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Codebewertung (char[]-Zerlegung)

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German)
View previous topic :: View next topic  
Author Message
Thomas Peterson
Guest





PostPosted: Tue May 16, 2006 9:04 pm    Post subject: Codebewertung (char[]-Zerlegung) Reply with quote



Hi,

habe mir da eben mal ein kleines Programm geschrieben, mit dem ich ein
char[] in Einzelteile zerlege. Wollte nun mal euch Experten fragen ob
das was ich da mache brauchbar/korrekt ist oder ob's noch schönere
Möglichkeiten gibt.

Besten Dank.


#include "stdafx.h"
#include "stdio.h"
#include "windows.h"

void split(char *string);

int main(void)
{
char test[30];
strcpy(test, "test.txt -r 123 -t 456 hallo");
split(test);

Sleep(20000); //damit man was sieht ;-)

}

void split(char *string)
{
char *sub_string;
while ( (sub_string = strtok(string, " ")) != 0)
{
string = 0;

if(strcmp(sub_string, (char*)"-r") == 0)
{

sub_string = strtok(string, " ");
if(sub_string != 0)
{
printf("sub string -r = '%s'\n", sub_string);
string = 0;
}
}
else if(strcmp(sub_string, (char*)"-t") == 0)
{
string = 0;
sub_string = strtok(string, " ");
if(sub_string != 0)
{
printf("sub string -t = '%s'\n", sub_string);
string = 0;
}
}
}
}


Gruß
Thomas

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Peter Stöcklein
Guest





PostPosted: Tue May 16, 2006 10:21 pm    Post subject: Re: Codebewertung (char[]-Zerlegung) Reply with quote



"Thomas Peterson" <p_thomas_spaaamaa_ (AT) gmx (DOT) de> schrieb im Newsbeitrag
news:e4d0lm$96e$1 (AT) online (DOT) de...
Quote:
Hi,

habe mir da eben mal ein kleines Programm geschrieben, mit dem ich ein
char[] in Einzelteile zerlege. Wollte nun mal euch Experten fragen ob das
was ich da mache brauchbar/korrekt ist oder ob's noch schönere
Möglichkeiten gibt.

Besten Dank.


#include "stdafx.h"
....
}


Gruß
Thomas

Ich konnte keinerlei C++ Codeelemente entdecken?
==> leider hast Du die falsche Newsgroup genommen.

Für die Analyse von Kommandozeilen bzw. deren Parametern, soweit
interpretiere ich die Absicht hinter deinem Code, findest Du weitläufig
Sourcecode.

Grüße Peter

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Jörg Barfurth
Guest





PostPosted: Wed May 17, 2006 9:21 am    Post subject: Re: Codebewertung (char[]-Zerlegung) Reply with quote



Thomas Peterson schrieb:
Quote:
Hi,

habe mir da eben mal ein kleines Programm geschrieben, mit dem ich ein
char[] in Einzelteile zerlege. Wollte nun mal euch Experten fragen ob
das was ich da mache brauchbar/korrekt ist oder ob's noch schönere
Möglichkeiten gibt.


Der Code ist selbst als C-Programm
- unschön
- von fragwürdiger Korrektheit
(ich weiß nicht ob man strtok noch einmal mit NULL aufrufen darf,
nachdem es NULL zurückgegeben hat)
- also jedenfalls guten Gewissens *nicht* als brauchbar zu bezeichnen

Und der Code ist kein C++-Programm, außer in dem eingeschränkten Sinne,
dass ein C++-Compiler ihn - nach Korrektur einiger Details - wohl
übersetzen kann.

Quote:
#include "stdafx.h"

Unbekannter Header - aber unnötig.

Quote:
#include "stdio.h"

Wenn du strtok/strcmp verwenden willst, fehlt hier noch

#include <string.h>

In C++ solltest du statt dieser C-Header aber besser die
C++-Standardbibliothek verwenden:

#include <string> // für std:string

#include <ostream>
#include <iostream> // für Ausgabe


Quote:
#include "windows.h"

Auch diesen Header gibt es nicht in Standard-C++.

Quote:
void split(char *string);


Diese Signatur ist schon ein schlechtes Zeichen. Deine Funktion erbt von
strtok das Manko, dass sie den String so schreddert, dass er unbrauchbar
wird. Eine Funktion um eine Zeichenkette zu parsen sollte einen
std:string als Argument haben oder, wenn es denn ein Zeichenarray sein
muss, sollte es wenigstens ein const char * sein.

Auf meinem System sagt die Dokumentation von strtok:

BUGS
Never use these functions. [...]

Quote:
int main(void)
{
char test[30];
strcpy(test, "test.txt -r 123 -t 456 hallo");

Schon fragwürdig. Liegt natürlich an der problematischen destruktiven
Funktionssignatur. Man muss hier jedenfalls mühsam nachzählen um die
Korrektheit der 'magischen' Zahl 30 zu prüfen - und bei einer Änderung
fliegt es dir leicht mal um die Ohren.

Quote:
split(test);

Sleep(20000); //damit man was sieht ;-)


Stammt vermutlich aus einem der Header, die es bei mir nicht gibt. Ist
aber auch überflüssig.

Tip: um auch auf deinem System was zu 'sehen', starte das Programm von
einer Kommandozeile ("Eingabeaufforderung"), statt durch Klicken.

Quote:
}

void split(char *string)
{
char *sub_string;
while ( (sub_string = strtok(string, " ")) != 0)
{
string = 0;


Du solltest für deine Tokentrenner eine benannte Konstante verwenden,
dann sieht man gleich, dass du jedesmal die gleichen verwendest und es
bleibt auch bei Änderungen so.

Und dieses Gehampel mit der Variablen string ist undurchsichtig.
Generell ist es selten eine gute Idee Funktionsparamter innerhalb der
Funktion zu modifizieren.

Wenn du schon meinst strtok einsetzen zu müssen, dann ist

for (char * token = strtok(string, trenner);
token != 0;
token = strtok( 0, trenner) )

eine bessere Variante.

In C++ arbeitest du aber stattdessen besser mit std:string und seinen
Memberfunktionen find_first_of und find_first_not_of. Du musst dann
allerdings selbst ein bisschen Positionsbuchhaltung betreiben. Die
Substrings extrahierst du dann mit der substr-Funktion.

Quote:
if(strcmp(sub_string, (char*)"-r") == 0)

Wozu dieser Cast? Zwar ist der Typ von "-r" char[3], aber in Ausdrücken
wird es implizit nach const char * konvertiert. Du castest das 'const'
weg, obwohl es gar nicht nötig wäre. (Wäre es nötig, dann wäre das
Programm höchstwahrscheinlich inkorrekt...)

Und wenn du mal casten musst, dann solltest du in C++ immer static_cast,
reinterpret_cast, const_cast oder dynamic_cast verwenden. Damit drückst
du klar aus, was du tun willst. C-Style Casts wie deiner können viel
tun, was du evtl gar nicht willst und sind schwerer lesbar - du solltest
sie aus deinem Repertoire streichen.

Quote:
{

sub_string = strtok(string, " ");
if(sub_string != 0)
{
printf("sub string -r = '%s'\n", sub_string);
string = 0;

Warum setzt du string hier auf 0? Das hast du schon oben getan - und das
ändert sich auch nicht mehr auf irgendeine magische Weise.

Quote:
}

Wie oben gesagt wäre ich nicht sicher, dass du strtok im 'else'-Falle
(also wenn du NULL zurückbekommst) noch einmal mit NULL als erstem
Argument aufrufen darfst. Du solltest also die Schleife in diesem Falle
vorzeitig abbrechen. Das macht dann aber die Schleifenlogik komplexer
als sie sein sollte.

Falls ich es noch nicht oft genug gesagt habe: strtok ist selbst in
einem C-Programm keine gute Idee; in einem C++-Programm hat diese
Funktion nichts zu suchen.

Quote:
}
else if(strcmp(sub_string, (char*)"-t") == 0)
{
string = 0;

Nochmal überflüssig!

Quote:
sub_string = strtok(string, " ");
if(sub_string != 0)
{
printf("sub string -t = '%s'\n", sub_string);
string = 0;

Schon wieder!? Ansonsten gilt das eben gesagte.

Quote:
}
}
}
}


Fazit: Schmeiss das Programm weg und fange an C++ zu lernen! Gehe nicht
über C! Fang dir nicht Pointerarithmetik- und char[]-Unsitten ein!

[Da du in dieser Gruppe postest, nehme ich an, dass du eigentlich in C++
programmieren willst. Für C gibt es andere Gruppen.]

Gruß, Jörg

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Andreas Huennebeck
Guest





PostPosted: Wed May 17, 2006 2:07 pm    Post subject: Re: Codebewertung (char[]-Zerlegung) Reply with quote

Thomas Peterson wrote:

Quote:
habe mir da eben mal ein kleines Programm geschrieben, mit dem ich ein
char[] in Einzelteile zerlege. Wollte nun mal euch Experten fragen ob
das was ich da mache brauchbar/korrekt ist oder ob's noch schönere
Möglichkeiten gibt.

Da es keine Zeile Kommentar gibt, die beschreibt, was das Programm machen soll, ist
eine vernünftige Bewertung eigentlich nicht möglich.

Für die Erkennung von Kommandozeilenparametern gibt es bereits vielfältige
Lösungen, sowohl auf C-Ebene (getopt) und mit C++ (z.B. in der Boost library:
http://www.boost.org/doc/html/program_options.html).

Tschau
Andreas
--
Andreas Hünnebeck | email: acmh (AT) gmx (DOT) de
----- privat ---- | www : http://www.huennebeck-online.de
Fax/Anrufbeantworter: 0721/151-284301
GPG-Key: http://www.huennebeck-online.de/public_keys/andreas.asc
PGP-Key: http://www.huennebeck-online.de/public_keys/pgp_andreas.asc

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Clas Onnebrink
Guest





PostPosted: Fri Jun 09, 2006 6:01 am    Post subject: Re: Codebewertung (char[]-Zerlegung) Reply with quote

"Thomas Peterson" <p_thomas_spaaamaa_ (AT) gmx (DOT) de> schrieb im Newsbeitrag
news:e4d0lm$96e$1 (AT) online (DOT) de...
Quote:
Hi,

habe mir da eben mal ein kleines Programm geschrieben, mit dem ich ein
char[] in Einzelteile zerlege. Wollte nun mal euch Experten fragen ob
das was ich da mache brauchbar/korrekt ist oder ob's noch schönere
Möglichkeiten gibt.

Besten Dank.


Ich habe hier mal sowas versucht nachzubilden wie ich mir so eine
Methode vorstellen könnte. Ist jetzt auch kein C++ in reinster Form aber
immerhin wird ein vector für die extrahierten Tokens verwendet. Wenn
du strtok verwendest und deine Methode split verwenden willst um z.B. eine
CommandLine aufzusplitten hast du ein Problem wenn es wichtig ist ob eine
Stelle nicht besetzt wurde. strtok ignoriert sowas und gibt an der Stelle wo
eigentlich ein LeerString sein müsste den nächsten gefundenen Wert. Anonsten
sollte
deine Plane-C Funktion auch das tun was du dort angegeben hast nämlich den
übergebenen String mit LeerZeichen als Trennzeichen zu splitten und die
einzelnen Tokens
auszugeben.

Was die Leistungsfähgikeit betrifft oder die Eleganz gibt es mit Sicherheit
noch viele andere Implmentierungen, die in diesen Fragen besser abschneiden
als deine
oder meine BeispielImplementierung. Ist auch immer eine Frage in welchem
Kontext die
jeweilige Implementierung ausgeführt wird und wie zeitkritisch die
Abarbeitung hier ist.

#include <iostream>
#include <vector>
#include <string>

using namespace std;

/***************************************************************************
***/
DWORD StringTokenize(LPCSTR InStrToTok,LPCSTR InSeps,vector<string>
*OutTokens)
{
DWORD Result = 0;

if ( (InStrToTok) &&
(InSeps) &&
(OutTokens)
)
{
OutTokens->clear();

LPSTR CurrentPtr = (LPSTR)InStrToTok;
LPSTR TokenPtr = NULL;
string TokenValue;

unsigned int SepLen = strlen(InSeps);

while (TokenPtr = strstr(CurrentPtr,InSeps))
{
TokenValue = "";

DWORD TokenValueLen = TokenPtr - CurrentPtr;

for (DWORD i = 0; i < TokenValueLen; i++)
TokenValue += CurrentPtr[i];

OutTokens->push_back(TokenValue);

CurrentPtr = TokenPtr + SepLen;

Result++;
}

TokenValue = CurrentPtr;

OutTokens->push_back(TokenValue);
Result++;

}
return ( Result );
}

Gruß,

Clas

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Andreas Huennebeck
Guest





PostPosted: Fri Jun 09, 2006 2:24 pm    Post subject: Re: Codebewertung (char[]-Zerlegung) Reply with quote

Clas Onnebrink wrote:

Quote:

"Thomas Peterson" <p_thomas_spaaamaa_ (AT) gmx (DOT) de> schrieb:

habe mir da eben mal ein kleines Programm geschrieben, mit dem ich ein
char[] in Einzelteile zerlege. Wollte nun mal euch Experten fragen ob
das was ich da mache brauchbar/korrekt ist oder ob's noch schönere
Möglichkeiten gibt.

Ich habe hier mal sowas versucht nachzubilden wie ich mir so eine
Methode vorstellen könnte. Ist jetzt auch kein C++ in reinster Form aber
immerhin wird ein vector für die extrahierten Tokens verwendet. [..]

Was die Leistungsfähgikeit betrifft oder die Eleganz gibt es mit
Sicherheit noch viele andere Implmentierungen, die in diesen Fragen besser
abschneiden als deine oder meine Beispielimplementierung. [..]

#include <iostream
#include <vector
#include <string

using namespace std;

/***************************************************************************
***/
DWORD StringTokenize(LPCSTR InStrToTok,LPCSTR InSeps,vector<string
*OutTokens)
{
DWORD Result = 0;

if ( (InStrToTok) &&
(InSeps) &&
(OutTokens)
)
{
OutTokens->clear();

LPSTR CurrentPtr = (LPSTR)InStrToTok;

Ich nicht weiß, was ein LPCSTR oder LPSTR ist, aber ein Cast ist immer
schlecht.

Quote:
LPSTR TokenPtr = NULL;
string TokenValue;

unsigned int SepLen = strlen(InSeps);

while (TokenPtr = strstr(CurrentPtr,InSeps))
{
TokenValue = "";

DWORD TokenValueLen = TokenPtr - CurrentPtr;

for (DWORD i = 0; i < TokenValueLen; i++)
TokenValue += CurrentPtr[i];

OutTokens->push_back(TokenValue);

CurrentPtr = TokenPtr + SepLen;

Result++;
}

TokenValue = CurrentPtr;

OutTokens->push_back(TokenValue);
Result++;

}
return ( Result );
}

Wenn ich den Code richtig verstehe, dann extrahiert er die einzelnen Token
und packt sie in den vector, und das in einem einzigen Aufruf. Der Nachteil
dieser Methode gegenüber strtok() ist, daß der Separator dann immer
derselbe ist. Bei strtok kann man den Separator bei jedem Aufruf neu wählen.

Ich habe auch so eine Funktion wie Deine geschrieben, allerdings ohne C-Funktionen
zu rufen, die auf Charakterarrays operieren:

#include <string>

template <class container> void UtilStringToken
(
const std::string& line, // string to extract tokens from
const std::string& separator, // separator characters
container& result // sequential string container, e.g. std::vector<std::string>
)
{
std::string::size_type start = line.find_first_not_of(separator);
if (std::string::npos == start) return; // nothing found
do
{
std::string::size_type end = line.find_first_of(separator,start);
if (std::string::npos == end)
{
result.push_back(line.substr(start));
start = std::string::npos; // finish loop
}
else
{
result.push_back(line.substr(start, end - start));
start = line.find_first_not_of(separator, end);
}
} while (std::string::npos != start);
}


Tschau
Andreas
--
Andreas Hünnebeck | email: acmh (AT) gmx (DOT) de
----- privat ---- | www : http://www.huennebeck-online.de
Fax/Anrufbeantworter: 0721/151-284301
GPG-Key: http://www.huennebeck-online.de/public_keys/andreas.asc
PGP-Key: http://www.huennebeck-online.de/public_keys/pgp_andreas.asc

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Clas Onnebrink
Guest





PostPosted: Sun Jun 11, 2006 6:57 am    Post subject: Re: Codebewertung (char[]-Zerlegung) Reply with quote

"Andreas Huennebeck" <acmh (AT) gmx (DOT) de> schrieb im Newsbeitrag
news:4est2fF1gcnv0U1 (AT) individual (DOT) net...

Quote:

Wenn ich den Code richtig verstehe, dann extrahiert er die einzelnen Token
und packt sie in den vector, und das in einem einzigen Aufruf. Der
Nachteil
dieser Methode gegenüber strtok() ist, daß der Separator dann immer
derselbe ist. Bei strtok kann man den Separator bei jedem Aufruf neu
wählen.

Ich habe auch so eine Funktion wie Deine geschrieben, allerdings ohne
C-Funktionen
zu rufen, die auf Charakterarrays operieren:

#include <string

template <class container> void UtilStringToken
(
const std::string& line, // string to extract tokens from
const std::string& separator, // separator characters
container& result // sequential string container,
e.g. std::vector<std::string
)
{
std::string::size_type start = line.find_first_not_of(separator);
if (std::string::npos == start) return; // nothing found
do
{
std::string::size_type end = line.find_first_of(separator,start);
if (std::string::npos == end)
{
result.push_back(line.substr(start));
start = std::string::npos; // finish loop
}
else
{
result.push_back(line.substr(start, end - start));
start = line.find_first_not_of(separator, end);
}
} while (std::string::npos != start);
}


Tschau
Andreas


Richtig. Mit strtok kannst du dynamisch mit unterschiedlichen Separatoren
splitten. Aber um Konfigurationsdaten
auseinander zu nehmen, die in einem bestimmten Format vorliegen ist meistens
auch nur ein fest definiertes TrennZeichen
vorhanden und dann reicht diese nicht dynamisch anpassbare Form aus. Ich
benötige diese Funktion häufig. Von
daher habe ich mir dafür eine Funktion geschrieben, die das hoffentlich
einiger maßen optimal macht.

/FrameWork : ToolSnippetLib
// File : StringTokenizeNew.cpp

#include <iostream>
#include <vector>
#include <string>

using namespace std;

//BEXTRACT//
/***************************************************************************
*********************************/
inline unsigned long StrTokEx(const string& InStrToTokenize,const string&
InSepStr,vector<string>& OutTokens)
{
string::size_type NextStartPos = 0;
if ((NextStartPos = InStrToTokenize.find(InSepStr)) == string::npos) {
OutTokens.push_back(InStrToTokenize);
}
else {
OutTokens.push_back(InStrToTokenize.substr(0,NextStartPos));

string::size_type NextCalcEndPos = 0;
while ( (NextCalcEndPos = InStrToTokenize.find(InSepStr,NextStartPos+1))
!= string::npos ) {
OutTokens.push_back(InStrToTokenize.substr(NextStartPos+1,
NextCalcEndPos-(NextStartPos+1)));
NextStartPos = NextCalcEndPos;
}


OutTokens.push_back(InStrToTokenize.substr(NextStartPos+1,InStrToTokenize.le
ngth()));
}

return ( OutTokens.size() );
}
//EEXTRACT//


/******************************/
int main(int argc,char *argv[])
{
if (argc == 3) {
string SplitStr = argv[1];
string SepStr = argv[2];

vector<string> TokItems;

unsigned long TokCount = StrTokEx(SplitStr,SepStr,TokItems);

for (unsigned long TokenIndex = 0; TokenIndex < TokCount; TokenIndex++)
cout << "TokenItem : " << TokenIndex+1 << " : " << TokItems[TokenIndex] <<
"\n";

} else {
cout << "\nSyntax : StringTokenizeNew.exe StrToSplit SepStr\n";
}
return 0;
}

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Andreas Huennebeck
Guest





PostPosted: Mon Jun 12, 2006 9:11 am    Post subject: Re: Codebewertung (char[]-Zerlegung) Reply with quote

Clas Onnebrink wrote:

Quote:
"Andreas Huennebeck" <acmh (AT) gmx (DOT) de> schrieb:

Wenn ich den Code richtig verstehe, dann extrahiert er die einzelnen Token
und packt sie in den vector, und das in einem einzigen Aufruf. Der Nachteil
dieser Methode gegenüber strtok() ist, daß der Separator dann immer
derselbe ist. Bei strtok kann man den Separator bei jedem Aufruf neu
wählen. [..]

Richtig. Mit strtok kannst du dynamisch mit unterschiedlichen Separatoren
splitten. Aber um Konfigurationsdaten
auseinander zu nehmen, die in einem bestimmten Format vorliegen ist
meistens auch nur ein fest definiertes TrennZeichen
vorhanden und dann reicht diese nicht dynamisch anpassbare Form aus. Ich
benötige diese Funktion häufig. Von
daher habe ich mir dafür eine Funktion geschrieben, die das hoffentlich
einiger maßen optimal macht.

/FrameWork : ToolSnippetLib
// File : StringTokenizeNew.cpp

#include <iostream
#include <vector
#include <string

using namespace std;

//BEXTRACT//
/***************************************************************************
*********************************/
inline unsigned long StrTokEx(const string& InStrToTokenize,const string&
InSepStr,vector<string>& OutTokens)
{
string::size_type NextStartPos = 0;
if ((NextStartPos = InStrToTokenize.find(InSepStr)) == string::npos) {
OutTokens.push_back(InStrToTokenize);
}
else {
OutTokens.push_back(InStrToTokenize.substr(0,NextStartPos));

string::size_type NextCalcEndPos = 0;
while ( (NextCalcEndPos = InStrToTokenize.find(InSepStr,NextStartPos+1))
!= string::npos ) {
OutTokens.push_back(InStrToTokenize.substr(NextStartPos+1,
NextCalcEndPos-(NextStartPos+1)));
NextStartPos = NextCalcEndPos;
}


OutTokens.push_back(InStrToTokenize.substr(NextStartPos+1,InStrToTokenize.le
ngth()));
}

return ( OutTokens.size() );
}
//EEXTRACT//

Ja, sieht meiner Implementierung sehr ähnlich. Aber was ist jetzt eigentlich der
Unterschied zwischen dieser Funktion (StrTokEx) und der von Dir früher geposteten
Funktion (StringTokenize)? Die machen doch eigentlich das gleiche, oder nicht?

Tschau
Andreas
--
Andreas Hünnebeck | email: acmh (AT) gmx (DOT) de
----- privat ---- | www : http://www.huennebeck-online.de
Fax/Anrufbeantworter: 0721/151-284301
GPG-Key: http://www.huennebeck-online.de/public_keys/andreas.asc
PGP-Key: http://www.huennebeck-online.de/public_keys/pgp_andreas.asc

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Clas Onnebrink
Guest





PostPosted: Thu Jun 15, 2006 9:11 am    Post subject: Re: Codebewertung (char[]-Zerlegung) Reply with quote

"Andreas Huennebeck" <acmh (AT) gmx (DOT) de> schrieb im Newsbeitrag
news:4f4lmoF1hovjoU3 (AT) individual (DOT) net...
Quote:
Clas Onnebrink wrote:

"Andreas Huennebeck" <acmh (AT) gmx (DOT) de> schrieb:

Wenn ich den Code richtig verstehe, dann extrahiert er die einzelnen
Token
und packt sie in den vector, und das in einem einzigen Aufruf. Der
Nachteil
dieser Methode gegenüber strtok() ist, daß der Separator dann immer
derselbe ist. Bei strtok kann man den Separator bei jedem Aufruf neu
wählen. [..]

Richtig. Mit strtok kannst du dynamisch mit unterschiedlichen
Separatoren
splitten. Aber um Konfigurationsdaten
auseinander zu nehmen, die in einem bestimmten Format vorliegen ist
meistens auch nur ein fest definiertes TrennZeichen
vorhanden und dann reicht diese nicht dynamisch anpassbare Form aus. Ich
benötige diese Funktion häufig. Von
daher habe ich mir dafür eine Funktion geschrieben, die das hoffentlich
einiger maßen optimal macht.

/FrameWork : ToolSnippetLib
// File : StringTokenizeNew.cpp

#include <iostream
#include <vector
#include <string

using namespace std;

//BEXTRACT//

/***************************************************************************
*********************************/
inline unsigned long StrTokEx(const string& InStrToTokenize,const
string&
InSepStr,vector<string>& OutTokens)
{
string::size_type NextStartPos = 0;
if ((NextStartPos = InStrToTokenize.find(InSepStr)) == string::npos) {
OutTokens.push_back(InStrToTokenize);
}
else {
OutTokens.push_back(InStrToTokenize.substr(0,NextStartPos));

string::size_type NextCalcEndPos = 0;
while ( (NextCalcEndPos =
InStrToTokenize.find(InSepStr,NextStartPos+1))
!= string::npos ) {
OutTokens.push_back(InStrToTokenize.substr(NextStartPos+1,
NextCalcEndPos-(NextStartPos+1)));
NextStartPos = NextCalcEndPos;
}



OutTokens.push_back(InStrToTokenize.substr(NextStartPos+1,InStrToTokenize.le
ngth()));
}

return ( OutTokens.size() );
}
//EEXTRACT//

Ja, sieht meiner Implementierung sehr ähnlich. Aber was ist jetzt
eigentlich der
Unterschied zwischen dieser Funktion (StrTokEx) und der von Dir früher
geposteten
Funktion (StringTokenize)? Die machen doch eigentlich das gleiche, oder
nicht?

Tschau
Andreas

Ist genau die gleiche Funktion nur diesmal ohne jegliche alten
Stringfunktionen aus der C-Runtime wie
z.B. strstr, strchar, strtok, strcat usw. Ich hatte deine Antwort als Kritik
an der Funktion gewertet und ich noch
nicht lange in dieser Newsgroup poste. Ich wollte halt nicht sofort am Start
alles
falsch machen. Weil hier doch streng auf C++ Style geachtet wird. Ich finde
es auch besser so wenn
man versucht diese beiden Themen auseinander zu halten und auch bei der
Entwicklung mit C++ darauf
achtet das C und C++ nicht bei Aufgabenlösungen wo es nicht sein muss einen
MixedMode verwendet..

gruss,

clas

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Andreas Huennebeck
Guest





PostPosted: Fri Jun 16, 2006 9:11 am    Post subject: Re: Codebewertung (char[]-Zerlegung) Reply with quote

Clas Onnebrink wrote:

Quote:
"Andreas Huennebeck" <acmh (AT) gmx (DOT) de> schrieb:
Ja, sieht meiner Implementierung sehr ähnlich. Aber was ist jetzt eigentlich der
Unterschied zwischen dieser Funktion (StrTokEx) und der von Dir früher geposteten
Funktion (StringTokenize)? Die machen doch eigentlich das gleiche, oder nicht?

Ist genau die gleiche Funktion nur diesmal ohne jegliche alten
Stringfunktionen aus der C-Runtime wie
z.B. strstr, strchar, strtok, strcat usw. Ich hatte deine Antwort als
Kritik an der Funktion gewertet und ich noch
nicht lange in dieser Newsgroup poste.

Ach so, klar. Na, dann kritisiere ich mal ...

- Im Gegensatz zu Deiner ersten Funktion löschst Du den Ergebnisvector
nicht, das finde ich gut. So kann man die Funktion auf mehrere Eingabestrings
anwenden und die Teilstrings im Ergebnisvector sammeln. Allerdings ist
dann der Rückgabewert nicht richtig (meine Lösung, nichts zurückzugeben,
ist aber auch nicht besser).
- Wenn kein Separator gefunden wird, dann packst Du den ganzen
zu parsenden String in den Vector. Das sollte aber dem Anwender
der Funktion überlassen werden, der (gerade wenn man obigen Fall
des 'Sammelns' betrachtet) besser weiß als die Funktion, ob ein
Eingabestring ohne Separator legal ist oder nicht. Daher sollte
die Funktion den Ergebnisvektor leerlassen (d.h. nichts dazupacken).

Tschau
Andreas
--
Andreas Hünnebeck | email: acmh (AT) gmx (DOT) de
----- privat ---- | www : http://www.huennebeck-online.de
Fax/Anrufbeantworter: 0721/151-284301
GPG-Key: http://www.huennebeck-online.de/public_keys/andreas.asc
PGP-Key: http://www.huennebeck-online.de/public_keys/pgp_andreas.asc

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.