komischer string-wert ... woher ??
-
Hallo,
folgender (compilierbare) code soll aus ner zeichenkette (unten als variable str)
alle zeichen bis zum auftreten des ersten doppelpunktes ausserhalb von zwei einschliessenden gaense-fuesschen liefern (ausschliessclich dem doppelpunkt).also sollte das ergebnis bei z.B. "\"hallo da:\":hier schluss" sein:
"hallo da:"
aber ich bekomme komische zeichen am ende woran liegt das ???vielen dank vorab.
int main(int argc, char *argv[]) { char *str = "\"Reaktion: keine Reaktion.\\r\\n\""; char *ptr_name = (char *)malloc((strlen(str)+1) * sizeof(char)); if(ptr_name==NULL) { printf("Could not allocate memory for name\n"); } else { unsigned gans_fuss_cnt = 0; unsigned within_entry = 0; unsigned n_cnt = 0; // copying each character of token before delim_char ':' for(unsigned i=0; i<strlen(str); i++) { if(str[i] == '"') { gans_fuss_cnt += 1; within_entry = (gans_fuss_cnt%2)? 1: 0; } // doppelpunkt ausserhalb zweier gaensefuesschen ? ... if((str[i]==':') && !within_entry) { ptr_name[n_cnt] = '\0'; break; } // alles was innerhalb von zwei gaensefuess und nicht ':' ist kopieren .. if((within_entry) || (str[i] != ':')) { ptr_name[n_cnt] = str[i]; n_cnt += 1; } } printf("%s\n", ptr_name); } return 0; }
-
char *ptr_name = (char *)malloc((strlen(str)+1) * sizeof(char));
1. sollte man nicht den Rückgabewert von malloc casten!
2. ist sizeof(char) unnötig, da sizeof(char) immer 1 istgans_fuss_cnt += 1;
benutz dafür lieber den ++ Operator. Sollte zwar auf fast allen Compilern genauso schnell laufen, aber man kann ja nie wissen
for(unsigned i=0; i<strlen(str); i++)
i sollte vom Typ size_t sein, weil strlen auch size_t zurückliefert!
Das du merkwürdige Zeichen am Ende des Strings hast, liegt daran, dass du den String nicht richtig terminierst.
-
1. sollte man nicht den Rückgabewert von malloc casten!
warum nicht ?? der rueckgabewert is doch void * ich brauche aber char *
Das du merkwürdige Zeichen am Ende des Strings hast, liegt daran, dass du den String nicht richtig terminierst.
in der schleife wird beim lesen von ':' aber doch ein '\0' angehaengt !?
und selbst wenn ich ausserhalb der schleife ptr_name nochmal zusaetzlich ein '\0' anhaenge bleibt der misst bei der ausgabe !?!?hat jemand mal den code versucht zu kompilieren!?!?
danke.
-
Original erstellt von <flipp_gleich_aus>:
**warum nicht ?? der rueckgabewert is doch void * ich brauche aber char *
**void* wird automatisch in char* konvertiert.
[ Dieser Beitrag wurde am 16.04.2003 um 15:25 Uhr von Bashar editiert. ]
-
danke fuer die infos..
uebrigens den fehler habe ich rausgefunden
wens interessiert:
nachdem ich ein zeichen in ptr_name kopiere muss das ende von ptr_name noch ein '\0' bekommne :)))gruss.
-
in der schleife wird beim lesen von ':' aber doch ein '\0' angehaengt !?
Aber nur wenn du ein : außerhalb von "" einliest und bei "\"Reaktion: keine Reaktion.\\r\\n\"" ist kein : außerhalb von ""
-
Zunächst Verbesserungen:
for(unsigned i = 0; i < strlen(str); i++) //Ruft jedesmal strlen() auf!
ersetzen durch
int len = strlen(str); for(unsigned i = 0; i < len; i++)
within_entry = (gans_fuss_cnt%2) ? 1 : 0; //Unnoetig kompliziert
ersetzen durch
within_entry = gans_fuss_cnt & 1;
Die eigentliche Aufgabe sollte aber in eine Funktion gesteckt werden.
char* FindCharNoQuote(char* _szString, char _cWhat) { char cCurr = *_szString; BOOL bInQuote = FALSE; while(cCurr) { if(cAktuell == '\"') bInQuote = !bInQuote; else if((cAktuell == _cWhat) && !bInQuote) return _szString; ++_szString; cCurr = *_szString; } return NULL; }