getline



  • Hey leute,

    bei folgender getline funtkion bin ich ein wenig konfus, was einige zeilen bedeuten....

    getline(char *feld,int laenge)
    {
    int z=0;
    int ch=0;
    laenge=laenge-1;
    
    fflush(stdin);
    
    for(z=0;(z<laenge)&&((ch=getchar())!=EOF)&&(ch != '\n');z++)
    {
    feld[z]=(char) ch; 
    }
    feld[z]='\0';
    
    if(z==laenge)
    {
    printf("Ihr eingegebenes Wort ist zu lang\n");
    printf("Uebernommenes Wort: %s\n",feld);
    }
    }
    

    Was heißt :
    ch=getchar())!=EOF
    und was bedeutet : feld[z]=(char) ch; ???

    Was die Funktion im Grunde genommen macht, ist mir klar(setezen des Determinierungbytes ans letzte Feldelement), nur ich komme nicht klar mit diesen beiden Ausdrücken...
    Ich arbeite call by reference und überschreibe jedes feldelement mit (char)ch ? was hat das zu bedeuten?

    bin für jede antwort dankbar-

    lg andi


  • Mod

    (ch=getchar())!=EOF
    

    Es wird eine Zuweisung gemacht (ch=getchar()). Dann wird geguckt, ob das was dort zugewiesen wurde ungleich EOF (End of file = Dateiende) ist.

    feld[z]=(char) ch;
    

    Das nennt man einen Cast. Casts dienen zur Umwandlung von inkompatiblen Datentypen ineinander. Der ist hier aber gar nicht nötig, da char und int kompatibel sind. Du kannst das (char) einfach weglassen.



  • Also wir haben int ch = 0 ;

    wenn ich jetzt sage -> ch = getchar()
    was habe ich dann?
    ich überschreibe doch jedes Feldelement mit ch oder nicht? Veränder ich dann nicht das originale Feld?

    #include <stdio.h>
    
    getline(char *feld,int laenge)
    {
    int z=0;
    int ch=0;
    laenge=laenge-1;
    
    fflush(stdin);
    
    for(z=0;(z<laenge)&&((ch=getchar())!=EOF)&&(ch != '\n');z++)
    {
    feld[z]=(char) ch; 
    }
    feld[z]='\0';
    
    if(z==laenge)
    {
    printf("Ihr eingegebenes Wort ist zu lang\n");
    printf("Uebernommenes Wort: %s\n",feld);
    }
    }
    
    void main() 
    {
    	char feld[100];
    	printf("\nBitte gib einen String ein>");
    	gets(feld);
    	printf("\n\n%s", feld);
    	getline(feld, 100);
    	printf("\n\n%s", feld);
    
    	getchar();
    	return 0;
    
    }
    

    Läuft zum Beispiel so nicht 😕


  • Mod

    ensi schrieb:

    Also wir haben int ch = 0 ;

    wenn ich jetzt sage -> ch = getchar()
    was habe ich dann?

    Einen int mit dem Wert den getchar zurückgibt. In den meisten Fällen ist dies der ASCII-Code eines eingegebenen Zeichens.

    ich überschreibe doch jedes Feldelement mit ch oder nicht? Veränder ich dann nicht das originale Feld?

    Ja, das originale feld wird überschrieben.

    Läuft zum Beispiel so nicht 😕

    Das ist nicht sehr hilfreich. Wenn du die ganzen Compilerfehler aufgrund der doppelten Definition von getline, dem fehlenden Typ von getline und dem falschen Rückgabetyp von main beseitigst, sollte das Programm funktionieren. Zumindest macht es das was du im Quellcode stehen hast, die Semantik ist aber vermutlich eine andere als von dir gedacht. Beispielsweise passt der Programmverlauf bei if-Abfrage am Ende von getline semantisch nicht zu dem was dort ausgegeben wird.

    Außerdem sollte dir dein Compiler noch eine sehr berechtigte Warnung geben, gets nicht zu benutzen.



  • fflush(stdin);

    Falsch. Führt zu undefiniertem Verhalten.
    fflush ist nur für Output-Streams definiert.

    void main()

    Auch falsch. Kein ANSI C.
    Richtig wäre

    int main()
    

    oder auch

    main()
    


  • Die Funktion getline habe ich aus dem F1 Hilfesuchfunktion gefunden 😕

    Könnte noch gesagt werden, ob diese Funktion jetzt die Anforderungen erfüllt bitte?
    Die Funktion soll verhindern, dass über die Feldgrenze hinaus geschrieben werden kann. Da ich morgen darüber ne Klausur schreibe, wäre ich seeeeehr dankbar 😕
    Aufrufen tu ich sie doch mit der Adresse eines Strings, z.B. die Adresse des ersten Feldelements eines Arrays oder arrayname an sich oder? Und die Länge ermittel ich über sizeof(array)/sizeof(datentyp) und schicke sie mit.
    Ich versteh nicht, warum das überschrieben wird, das ist doch nicht Sinn der Sache, das Originalfeld zu üüberschreiben 👎 das ist alles so deprimierend... -.-



  • Prinzipiell ja.

    Falls feld als Characterarray definiert ist, wäre der Aufruf mittels

    getline(feld, sizeof(feld));
    

    besser.

    Fall feld als Zeiger definiert ist, also

    char *feld;
    feld=malloc(100);
    

    funktioniert sizeof natürlich nicht!

    Wenn du dein Wort "überschreiben" durch "befüllen" ersetzt, wird doch wohl einiges klarer?
    Du definierst ein Array mit Platz für 100 Elemente (in diesem Fall vom Typ char), welches du anschließend max. bis zu seiner Größe befüllst.
    Was ist daran schwer zu verstehen?



  • WIr haben doch gesagt, dass wir mit dem Originalfeld arbeiten, und wenn ich jetzt jedes Feld mit einem ch "befülle" dann geht doch das eigtl. wort verloren, oder seh ich das falsch? ⚠


Log in to reply