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 ist

    gans_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;
    }
    

Anmelden zum Antworten