Problem bei Strings kopieren und Speicher-allocation, String ändert sich immer



  • Hallo an Alle!

    Bin sehr neu in C und habe gerade ein Problem wo ich echt nicht die Ursache dafür finden kann:

    Ich möchte eine Datei Zeilenweise einlesen, und die erste Zeile möchte ich als ID speichern! Jedoch ändert sich meine ID bei jedem durchlauf der Schleife :S:

    void generate_phage(char *link)
    {
        Organism *org;  //einfach eine Struktur mit bis jetzt nur einem char *ID als Attribut
    
     org = (Organism *) malloc(sizeof(Organism *));
    
        ALLOC(org->org_ID, char, 1); //Speicher um die ID zu speichern??
    
       FILE *file = fopen(link, "r");
    
       if (file == NULL) 
        {
            fprintf(stderr, "Cannot open given link\n");
            exit(1);
        }
    
        int max_size = 1000;
        int line_num = 0;
    
        char *line = (char *) malloc(sizeof(char)*max_size);
    
      while (fgets(&line[strlen(line)],max_size,file)!= NULL) 
        {
    
            if (line[strlen(line)-1] == '\n')
            {
                if (line_num == 0) { //Hier moechte ich meine ID speichern
    
                    line[strlen(line)-1] = '\0';
                    int i;
    
    //hier motechte ich nur das Substring ab Org_ID
    //Ist also in der ersten Zeile Org_ID: Tiger, ist meine ID = Tiger
                    int posOfSub = strlen("Org_ID: ");
                    char org_Name[strlen(line)-posOfSub+1];
    
                    int j = 0;
                    for (i = 0; i < strlen(line);i++)
                    {
                        if (i >= posOfSub) {
    
                            org_Name[j] = *(line +i);
                            j++;
                        }
    
                    }
                    org_Name[strlen(line)-posOfSub] = '\0';
    
    //hier dachte ich, wenn ich den String kopiere statt nur = zu setzen, wird er auch immer gleich bleiben
                    strcpy(org->org_ID, org_Name);
    
     printf("org name is: %s\n", org->org_ID); //hier passt es noch
                } else {
    
                   // für dieses Beispiel egal....
                    }
    
                }
                printf("org name is by end of loop: %s\n", org->org_ID); 
    
                //hier ändert sich der name jetzt immer, indem ab einem Punkt die neue Zeile der Datei drangehängt wird :S...
    
    line[0] = '\0'; //empty string
                line_num++;
    
            } 
        }
    
        free(line);
    fclose(file);
    
    }
    


  • Du hast nur ein org und auch nur ein org->org_ID in der gesammten Funktion.

    Mit org = (Organism *) malloc(sizeof(Organism *)); besorgst du Speicher platz für einen Zeiger auf Organism .
    Dass passt nicht zu dem Typ von org.
    Du willst Speicher für Organism besorgen. (das mag im Augenblick noch gleich groß sein, sobal deine struct noch einen Member bekommt, ist es damit vorbei)

    Ich kenne ALLOC nicht, aber ich denke, dass auch der Aufruf verkehrt ist.
    Ich versthe das als "Besorge Platz für 1 char und lasse org->org_ID darauf zeigen"
    Ein Zeichen kann gerade mal die '\0' für das Stringende aufnehmen.

    Hab das hier gefunden: http://pastebin.com/BdCqb6Vc
    (Dann habe ich es richtig gedeutet)

    Auch solltest du dir Rückgabewerte von malloc und realloc prüfen, ob diese erfolgreich waren.

    Erklär doch mal, was du machen möchtest. Was, nicht wie.


Anmelden zum Antworten