Char Array - größe ändern ergibt in der Ausgabe 1x ok 1x Müll ????



  • Hallo Leute,
    hab mal wieder ein bisschen herumgespielt und bin auf folgendes Rätsel gestossen:

    Ich lese eine XML Datei ein. Gebe dann 1 Zeile dieser Datei an eine Funktion weiter um die Textelemente zu zerlegen.
    Wenn ich nun die Array Größe verändere kommt 1x Müll raus und 1x stimmt die Ausgabe.
    Wenn ich nodename[256] schreibe kommt der Müll (p%..) raus.

    char *node, nodename[45], nodefeld[125], nodewert[256];
    
    Nodename: p%↑ Laenge: 3
    Nodefeld: encoding Laenge: 8
    Nodewert: UTF-8 Laenge: 5
    
    Nodename: xml Laenge: 3
    Nodefeld: encoding Laenge: 8
    Nodewert: UTF-8 Laenge: 5
    

    Check ich nicht warum das passiert.
    Hier mal meine komplette Funktion:

    // xml version="1.0" encoding="UTF-8"
    // PERSON  Hausnr="99" LandesCd="AUT" Ort="Kaindorf bei Hartberg" PLZ="8224" PersArtCd="S" Personennr="2918745850@13866256" Strasse="Kaindorf"
    void node_split(char *parent_node){     
        char *node, nodename[45], nodefeld[125], nodewert[256];
        int x = 0, i = 0;
        node = strdup(parent_node);
    
        while (node[i] != '\0'){ 
    
            if(strlen(nodename) == 0){
                while (node[i] != ' ')
                    nodename[x++] = node[i++];
                x=0;
            }
                
            if (node[i] == ' '){
                i++;
                while (node[i] != '=')
                    nodefeld[x++] = node[i++];
                x=0;
            }
    
            if (node[i] == '"')
            {
                i++;
                while (node[i] != '"')
                    nodewert[x++] = node[i++];
                x=0;
            }        
            i++; 
        }
        free(node);
    
        printf("Nodename: %s Laenge: %u\n",nodename, strlen(nodename));
        printf("Nodefeld: %s Laenge: %u\n",nodefeld, strlen(nodefeld));  
        printf("Nodewert: %s Laenge: %u\n",nodewert, strlen(nodewert)); 
    }
    


  • @WienMax lokale Variablen werden, wenn sie nicht explizit initialisiert werden, nicht vorbesetzt.
    In den Arrays, die du in Zeile 4 definierst steht halt irgendwelcher Müll.
    Das strlen in Zeile 10 kann irgendeinen Wert liefern.

    Zudem terminierst du deine Strings nicht (mit '\0')



  • Ist es dann besser wenn ich mit char * arbeiten würde?



  • @WienMax sagte in Char Array - größe ändern ergibt in der Ausgabe 1x ok 1x Müll ????:

    Ist es dann besser wenn ich mit char * arbeiten würde?

    Das würde nur Platzprobleme auf dem Stack beheben, aber nicht die aufgeführten Fehler.

    Du kannst ein Array aber mit "" initialisieren (das geht nur bei der Definition).
    char *node, nodename[45] = "", ...
    oder später im Code nodename[0] = '\0'; // nodename auf Länge 0

    Und nach den while-Schleifen noch

        while (node[i] != ' ')
            nodename[x++] = node[i++];
        nodename[x] = '\0'; // Terminierung
        x=0;
    

Anmelden zum Antworten