Char Array Problem
-
Also, ich habe ein Problem mit einem Char Array. Ich bekomme in dem Programm einen String. Diesen muss ich dann Zeichen für Zeichen überprüfen. Der folgende Ausschnit zeigt einen Teil, wo aus einem großen String kleinere gemacht werden sollen.
Dazu wird der große in einen char array kopiert und dieser array dann mit einer for schleife durchwandert. Gleichzeitig gibt es einen 2. Char Array wo jedes gelesene zeichen reingeschrieben wird. Sobald ein bestimmtes zeichen gefunden wird, soll der inhalt dieses 2. char arrays in einen neuen string geschoben werden. Dann wird der char array gelöscht und kann wieder weiter neu befüllt werden. das ganze kann beliebig oft passieren.
// Gesamten String unterteilen in viele kleine einzelne Strings // Zweck: Damit können jetzt die einzelnen TeilStringe getrennt voneinander // bearbeitet bzw ausgerechnet werden string TempString = ""; string *TeilString = new string[MAX+3]; bool *TeilStringD = new bool[MAX+3]; int TSid = 1; // TeilSting Id fängt bei 1 an bis x for (it = 0; it < MAX; ++it) { switch (CString[it]) { case '(': if (KlammerAnz == 0){ if (it != 0){ TempString = ""; CTeilString[itn+1] = '\0'; TempString = CTeilString; if (TempString != ""){ TeilString[TSid] = CTeilString; TSid++; strcpy(CTeilString, empty.c_str()); itn = 0; } } } CTeilString[itn] = CString[it]; itn++; KlammerAnz++; break; case ')': if (KlammerAnz > 0){ CTeilString[itn] = CString[it]; CTeilString[itn+1] = '\0'; TeilString[TSid] = CTeilString; TSid++; itn = 0; strcpy(CTeilString, empty.c_str()); KlammerAnz--; } else { // Klammer geschlossen ohne offener throw eWrongSyntax(); } break; case '+': if (it != 0){ // Falls 1. Zeichen soll bisheriger Teilstring nicht gespeichert werden if (KlammerAnz == 0){ TempString = ""; CTeilString[itn+1] = '\0'; TempString = CTeilString; if (TempString != ""){ TeilString[TSid] = CTeilString; cout<<"Speichere: "<<TeilString[TSid]<<endl; TSid++; strcpy(CTeilString, empty.c_str()); itn= 0; } } CTeilString[itn] = CString[it]; if (KlammerAnz == 0){ CTeilString[itn+1] = '\0'; TeilString[TSid] = CTeilString; cout<<"Speichere: "<<TeilString[TSid]<<endl; TSid++; itn = 0; strcpy(CTeilString, empty.c_str()); } } else { // Erstes Zeichen darf kein + sein throw eWrongSyntax(); } break; case '-': if (KlammerAnz == 0){ if (it != 0){ // Falls 1. Zeichen soll bisheriger Teilstring nicht gespeichert werden TempString = ""; CTeilString[itn+1] = '\0'; TempString = CTeilString; if (TempString != ""){ TeilString[TSid] = CTeilString; TSid++; strcpy(CTeilString, empty.c_str()); itn= 0; } } } CTeilString[itn] = CString[it]; if (KlammerAnz == 0){ CTeilString[itn+1] = '\0'; TeilString[TSid] = CTeilString; TSid++; itn = 0; strcpy(CTeilString, empty.c_str()); } break; case '*': if (it != 0){ // Falls 1. Zeichen soll bisheriger Teilstring nicht gespeichert werden if (KlammerAnz == 0){ TempString = ""; CTeilString[itn+1] = '\0'; TempString = CTeilString; if (TempString != ""){ TeilString[TSid] = CTeilString; TSid++; strcpy(CTeilString, empty.c_str()); itn = 0; } } CTeilString[itn] = CString[it]; if (KlammerAnz == 0){ CTeilString[itn+1] = '\0'; TeilString[TSid] = CTeilString; TSid++; itn = 0; strcpy(CTeilString, empty.c_str()); } } else { throw eWrongSyntax(); } break; default: // keine Klammer TempString.append(CString[it]) //CTeilString[itn] = CString[it]; itn++; break; } }Problem: Es wird nur blödsinn gespeichert in den einzelnen strings. Grund dafür ist nehm ich mal an das der CTeilString nicht komplett gelöscht wird. Auch der \0 hat nicht geholfen leider.
Ideen wie ich den Inhalt meines CTeilString's 1:1 übertragen kann ohne 100.000 sonderzeichen danach?
LG
Daniel
-
Um einen string aufzudröseln und beliebig neu zusammenzusetzen sollte man zeichenweise vorgehen und das abschliessende Nullzeichen '\0' explizit selbst setzen. Etwa so:
char string1[]="Hallo Leute";
char string2[24];
int i,c;
for(i=0;i<5;i++)
{
c=string1[i];
string2[i]=c;
}
i++;
string2[i]='\0';
strcpy(string2," Mann");Merke: Characters sind Integer-Werte. Strings sind eine Folge von Integer-Werten mit dem Nullzeichen zur Kennzeichnung des Endes. daddeldu
-
berniebutt schrieb:
Um einen string aufzudröseln und beliebig neu zusammenzusetzen sollte man ...
(std::)string nehmen. Eigentlich sehe ich keinen Grund, substr(), find(), operator=() und replace() zum 1001. Mal nachzuprogrammieren (ausser evtl. zur persönlichen Erbauung).
Siehe auch
abzy schrieb:
Also, ich habe ein Problem mit einem Char Array. ...

Gruß,
Simon2.