Aufgabe 2 - einlesen von zeilen


Ich hoffe das jemand die Zeit und musse hat, sich das mal anzuschauen:
Folgende beiden Probleme habe ich:

Es wird nur jedes zweite Wort gelesen.

Wen ich akt_zeiger am Schluss auf NULL setze bringt er mir nach dem dritten Wort ein Segmentation Fault.

char akt_wort; / Zwischenspeicher /
int counter=0; /
Zähler für Anzahl der Worte */
char *liste; / Liste der Wörter */

void makeliste (){

akt_wort=(char *) calloc(150,sizeof(char));
liste=(char **) malloc(sizeof(char *));
if(liste==NULL){
perror(“Fehler,calloc liste”);

}

while(1==1){
if(!fgets(akt_wort,150,stdin)) break;

fgets(akt_wort,150,stdin);                   

if(strlen(akt_wort)<101){                       
   if(strlen(akt_wort)>1){                   



   liste=(char **)realloc(liste,(counter + 1) * sizeof(char *));              
 if(liste==NULL) perror("Fehler:realloc,liste");
                     
 
   liste[counter]= malloc ((strlen(akt_wort)+1)*sizeof (char *));                      
       if(liste[counter]==NULL) perror("Fehler:calloc, liste[counter]");
 
 
   
   strcpy(liste[counter],akt_wort);
                                    
  counter++;                                                          
  
  }
}
else{
  perror("Fehler:Eingegebenes Wort ist zu lang ");
}

}
}


hab den code nicht so genau angeschaut ob sonst noch fehler drin sind, aber was mir sofort ins auge sticht :

if(!fgets(akt_wort,150,stdin)) break;

fgets(akt_wort,150,stdin);            

hier rufst du 2x fgets auf! was du im if eingelesen hast wird aber sofort wieder durch das nächste fgets überschrieben also weggeworfen!


Danke.
Das war wirklich das Problem.
:-p
War wohl ein kliener denkfehler. :anx:


Hallo Lucius,

also ich hab mir deinen code mal angeschaut, eigentlich solltet ihr ja so lange Codestuecke nicht veroeffentlichen, aber wer das in sein Programm einbaut muss damit erstmal zurechtkommen :slight_smile:

Was soll denn makeliste machen? Das macht Speicherplatz fuer die Liste und fuer ein Element, Ums Aufraeumen des Speicherplatzes muss sich dann der Aufrufer kuemmern, was man dort dann leicht vergisst.

liste=(char **) malloc(sizeof(char *));       
if(liste==NULL){                              
     perror("Fehler,calloc liste");
   
  }

Bei derartigen Stellen macht es meistens keinen Sinn mehr weiterzumachen, wenn der Speicher randvoll ist kann man z.B. keine weiteren Worte mehr einlesen also auch keine vollstaendige Liste mehr ausgeben, da kommt besser ein exit(EXIT_FAILURE); rein.

while(1==1){                                 
    if(!fgets(akt_wort,150,stdin)) break;      

    fgets(akt_wort,150,stdin); 

Du machst hier eine Endlosschleife und in der naechsten Zeile eine Abbruchbedingung. Dann uebergehst du eine Zeile (siehe Mickey) undliest liest die naechste ein. Und warum gleich 150 Zeichen?

 if(strlen(akt_wort)<101){                      
       if(strlen(akt_wort)>1){      
...
       }
      else{
      perror("Fehler:Eingegebenes Wort ist zu lang ");
      }
}

so lange if Abschnitte kann man spaeter schlecht lesen, besser hier auf >100(bzw 101 mit \n) zu ueberpruefen, Meldung ausgeben und continue (das springt in der while schleife wieder nach vorne zur Abbruchbedingung).
Ein perror kann man da auch nicht machen. perror kann man nur bei Fehlerausgaben von system und libC aufrufen verwenden, also malloc, readdir, fopen, aber nicht bei Benutzerfehlern oder Fehlern im Programmablauf.

  liste=(char **)realloc(liste,(counter + 1) * sizeof(char *));             
     if(liste==NULL) perror("Fehler:realloc,liste");

Kleiner Tipp hier, wenns nicht zu unuebersichtlich wird kann man sich hier schreibarbeit sparen:

if ( !( liste= (char **) realloc(liste, (counter+1) * sizeof (char*)) ) ) {
           perror("wsort: einlesen");
           exit( EXIT_FAILURE );
}

Ich hoffe das kam jetzt nicht zu streng oder was rueber, ich hab einfach zu allem was ich anders (ob besser ist oft ansichtsache) machen wuerd was geschrieben.

…Bailing out


@frahi: Mit Kritik habe ich kein Problem.
Sonst würde ich ja keine fragen stellen, betreffend meiner arbeit.

Wegen, keinen Code ins Netz stellen, da der Abgabetermin schon längst vorbei ist, mache ich mir da keine sorgen.