Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Strings in eine Liste lesen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
12.05.2008, 22:40 Uhr
Kentu



Sers, bin relativ neu auf dem gebiet der programmiersprachen und da passieren halt noch fehler. auch solche die man net findet. kann mir einer sagen was hier nicht geht?


C++:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>



main(){
    struct element{
        struct element *next;
        char *zeichenkette;
    };
    
    char z[30];
    struct element *k, *start=NULL, *lauf=NULL;
        
    while(!feof(stdin)){
        if ((fgets(z,sizeof(z),stdin)) != NULL){
            k = (struct element*)malloc(strlen(z)+1);
            k->zeichenkette=z;
            k->next=NULL;
            if(start==NULL)
            {
                start=k;
                lauf=k;
            }else
            {
                lauf->next=k;
                lauf=k;        
            }    
            
        }
    }
    lauf=start;
    while (lauf!=NULL){
        fputs(lauf->zeichenkette, stdout);
        lauf=lauf->next;
    }
    
}



ich bekomm immer nur die das letzte wort ausgegeben. also wenn ich 3 wörter eingeb, dann gibt der mir 3 mal das letzte wort aus. seh den fehler einfach net. pls help
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
12.05.2008, 23:40 Uhr
0xdeadbeef
Gott
(Operator)


Das hier:

C++:
k = (struct element*)malloc(strlen(z)+1);
k->zeichenkette=z;


ist erstens ziemlich merkwürdig bei der Speichervergabe - wenn strlen(z) kleiner ist als sizeof(struct element) - 1, geht das böse daneben - und zweitens weist es allen drei "structs" die selbe Speicheradresse als String-Member zu. Das heißt, wenn das nächste Element eingelesen wird, wird der String in allen übrigen Structs ersetzt.

Stattdessen muss das

C++:
k = malloc(sizeof(struct element));
k->zeichenkette = malloc(strlen(z) + 1);
strcpy(k->zeichenkette, z);


sein.

Außerdem, am Ende nicht vergessen, den gemallocten Speicher wieder freizugeben.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
13.05.2008, 17:14 Uhr
Kentu



dickes thx. jetzt geht alles!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
13.05.2008, 17:46 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)



Zitat von 0xdeadbeef:
Außerdem, am Ende nicht vergessen, den gemallocten Speicher wieder freizugeben.

Das hast du auch berücksichtigt?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
13.05.2008, 21:41 Uhr
Kentu



jopp


C++:
lauf=start;
while (lauf!=NULL){
    free(start);
    lauf=lauf->next;
    start=lauf;
    }


 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
14.05.2008, 00:57 Uhr
0xdeadbeef
Gott
(Operator)


Um...auf die Art gibst du free immer die selbe Speicheradresse, und lauf ist nach dem ersten Aufruf ungültig, weil's schon gefreet wurde. Das muss etwa so aussehen:

C++:
lauf = start;

while(lauf != NULL) {
  lauf = start->next;
  free(start);
  start = lauf;
}


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: