Funktion char *fgets(char *s, int size, FILE *stream);



  • Hallo,

    in der Manpage zur Funktion fgets(3) steht folgendes:
    fgets() reads in at most one less than size characters from stream and
    stores them into the buffer pointed to by s. Reading stops after an
    EOF or a newline. If a newline is read, it is stored into the buffer.
    A terminating null byte ('\0') is stored after the last character in
    the buffer.

    Wenn ich den Standardeingabekanal benutze, werden allerdings mehr als "size" characters eingelesen. Woran liegt das?

    Außerdem verstehe ich folgendes nicht:

    char *array = (char*) malloc(sizeof(char*));
    array = "Test";
    printf("%s",array);
    

    Warum wird hier "Test" ausgegeben, obwohl ich nur Platz für ein Zeichen reserviert habe?

    Danke für eure Hilfe 🙂



  • qwert_zuiopü schrieb:

    Wenn ich den Standardeingabekanal benutze, werden allerdings mehr als "size" characters eingelesen. Woran liegt das?

    Daran, dass du einen Fehler gemacht hast. Poste Code.

    qwert_zuiopü schrieb:

    Warum wird hier "Test" ausgegeben, obwohl ich nur Platz für ein Zeichen reserviert habe?

    Weil du in Zeile 2 nicht in den Speicherplatz schreibst auf den array zeigt, sondern einfach nur den Pointer array auf das Stringliteral "Test" zeigen lässt. (Abgesehen davon reservierst du nicht Platz für einen char, sondern für einen char*, das könnten bei dir z.B. statt einem auch 4 oder 8 Byte sein.)

    Edit @SeppJ: Höhö, die Wochentage gehören einfach mir. 😃


  • Mod

    qwert_zuiopü schrieb:

    Wenn ich den Standardeingabekanal benutze, werden allerdings mehr als "size" characters eingelesen. Woran liegt das?

    Woran merkst du das?

    Außerdem verstehe ich folgendes nicht:

    char *array = (char*) malloc(sizeof(char*));
    array = "Test";
    printf("%s",array);
    

    Warum wird hier "Test" ausgegeben, obwohl ich nur Platz für ein Zeichen reserviert habe?

    😮 Gah! Weil du weder Speicherverwaltung, noch Zeichenketten noch Literale noch Arrays verstanden hast.



  • Gah! Weil du weder Speicherverwaltung, noch Zeichenketten noch Literale noch Arrays verstanden hast.

    Das hab ich auch gemerkt, deswegen stell ich ja solche Fragen 😉
    Aber gut, ich schau mir erstmal das ganze nochmal an. 🕶



  • Fange erstmal mit klassischen Arrays an, malloc und so Zeugs schaue dir danach an.



  • So, jetzt ist eine Frage aufgekommen :):

    int *p;
    p = malloc(sizeof(short));
    p = 2577;
    

    Warum geht das? Wird der Speicherbereich sozusagen automatisch erweitert? D.h. ich kann nicht davon ausgehen, dass der Wert immer bei 2577 bleibt, weil zufällig eine andere Variable den Speicherplatz erhalten kann?


  • Mod

    qwert_zuiopü schrieb:

    Warum geht das?

    Weil du nicht den blassesten Schimmer hast, was du da getan hast. Lern Grundlagen!

    Du hast deinem Zeiger einen anderen Wert zugewiesen, er zeigt jetzt auf Adresse 2577. Es ist zwar technisch erlaubt eine Ganzzahl in einen Pointer umzuwandeln, aber praktisch niemals sinnvoll (außer vielleicht bei 0). Dein Compiler wird dich auch ganz sicher vor dem Unsinn warnen, wenn du ihm nur sagen würdest, dass er dich vor typischen Anfängerfehler bewahren soll.

    Wird der Speicherbereich sozusagen automatisch erweitert? D.h. ich kann nicht davon ausgehen, dass der Wert immer bei 2577 bleibt, weil zufällig eine andere Variable den Speicherplatz erhalten kann?

    Das ist unangenehm nahe an dem was man "magisches Denken" nennt.



  • Sorry, beim Abschreiben ist mir ein Fehler passiert 🤡

    die letzte Zeile sollte

    *p = 2577

    heißen.



  • qwert_zuiopü schrieb:

    die letzte Zeile sollte

    *p = 2577
    

    heißen.

    Damit ist es dann sogar undefiniertes Verhalten, während es vorher nur fachlicher Unsinn war.
    Du stocherst nur im Nebel rum und weißt nicht, was du tust.



  • also laut allen meinen Tutorials ist die Anweisungsfolge

    int *p;
    p = malloc(sizeof(int));
    *p = 2;

    absolut korrekt. Mir geht es darum, was passiert, wenn ich zu wenig Speicher anfordere. Insofern kannst du höchstens behaupten ich würde mich mit malloc und der Speicherverwaltung nicht auskennen 😉 .



  • Richtig irgendwo abschreiben kannst du auch nicht.
    Oben schriebst du noch sizeof(short), jetzt aber sizeof(int).
    Falls es dir noch keiner gesagt hat: das ist ein Unterschied bei der C Programmierung.



  • dann verstehst du scheinbar den Grund meines Themas hier nicht. Denn auf genau den Unterschied möchte ich hinaus..
    Ich fordere Speicher für einen Character an, schreibe dann aber einen größeren Integer rein. Meine Frage ist nun, ob der Integerwert quasi "instabil" ist, also im Prinzip nicht vorhergesagt werden kann.


  • Mod

    qwert_zuiopü schrieb:

    Ich fordere Speicher für einen Character an

    Diablo 3?

    Meine Frage ist nun, ob der Integerwert quasi "instabil" ist, also im Prinzip nicht vorhergesagt werden kann.

    Das hat Wutz direkt beantwortet.

    Wutz schrieb:

    Damit ist es dann sogar undefiniertes Verhalten, während es vorher nur fachlicher Unsinn war.



  • Wenn schon, dann war es sowohl vorher als auch nachher undefiniertes Verhalten und nicht lediglich fachlicher Unsinn, wie von Wutz behauptet.

    Außerdem war meine einige Posts weiter oben getätigte Aussage "D.h. ich kann nicht davon ausgehen, dass der Wert immer bei 2577 bleibt, weil zufällig eine andere Variable den Speicherplatz erhalten kann?" vollkommen richtig.

    Der Ton in diesem Forum ist schon sonderbar.. Vielleicht solltet ihr euren Stress wo anders abbauen.. Nehmt euch ein Beispiel an "java-forum.org" ...



  • "Character" (char) nicht gleich "short" und "int" ist wieder was anderes. In einen "short" passt 2577 ohne probleme rein.

    short s;
    s=70000; // kein undefiniertes Verhalten, einfach eine Verkürzung des Wertes
    
    int *p;
    p = (int*)malloc(sizeof(short)); //führt zu undefiniertem verhalten
    p = (int*)malloc(sizeof(int)); //ist richtig
    *p = 2577;
    

    Du solltest dir dringend nochmal die datentypen anschauen die es gibt, da gibts unterschiede im wertebereich..

    Ich hoffe damit habe ich jetzt alles abgedeckt was du meinen könntest.



  • Sehr schön, danke; auch für deinen freundlichen Ton 👍



  • Du bist ein klassischer Noob.
    Von nichts Ahnung, lernunwillig und gebrauchst Fachbegriffe ohne sie verstanden zu haben. Deine provozierenden Fragestellungen um doch noch eventuell jemanden Fachwissen zu entlocken, das du dann sowieso ignorierst, ist leicht durchschaubar.
    Gehe doch in das Forum deiner Wahl oder wende dich direkt an den Tutorialmacher, wenn es Fragen offenlässt.


  • Mod

    qwert_zuiopü schrieb:

    Wenn schon, dann war es sowohl vorher als auch nachher undefiniertes Verhalten und nicht lediglich fachlicher Unsinn, wie von Wutz behauptet.

    Nein, das war wunderbar definiert vorher, nur Unsinn.

    Außerdem war meine einige Posts weiter oben getätigte Aussage "D.h. ich kann nicht davon ausgehen, dass der Wert immer bei 2577 bleibt, weil zufällig eine andere Variable den Speicherplatz erhalten kann?" vollkommen richtig.

    Nein. Deine Begründung ist Quatsch.

    DarkShadow44 schrieb:

    int *p;
    p = (int*)malloc(sizeof(short)); //führt zu undefiniertem verhalten
    p = (int*)malloc(sizeof(int)); //ist richtig
    *p = 2577;
    

    Zeile 2 ist wunderbar definiert, nur fachlicher Unsinn. Zeilen 2 und 3 haben beide einen fachlich unsinnigen Cast.

    qwert_zuiopü schrieb:

    Sehr schön, danke; auch für deinen freundlichen Ton 👍

    War aber falsch.



  • Was war denn genau falsch von DarkShadow44?

    @Wutz: Hast du auch nur einen einzigen Beleg für deine Aussage, ich sei "lernunwillig"? Nur weil du so lange gebraucht hast, meine Frage zu verstehen?


  • Mod

    qwert_zuiopü schrieb:

    @Wutz: Hast du auch nur einen einzigen Beleg für deine Aussage, ich sei "lernunwillig"?

    Zum Beispiel das hier:

    Was war denn genau falsch von DarkShadow44?

    Deckt sich wunderbar mit

    Wutz schrieb:

    doch noch eventuell jemanden Fachwissen zu entlocken, das du dann sowieso ignorierst

    Denn ich habe schon erklärt, was bei Darkshadow faslch ist, aber dafür müsstest du schon 1-2 Sätze aufmerksam lesen. Oder:

    qwert_zuiopü schrieb:

    Wenn schon, dann war es sowohl vorher als auch nachher undefiniertes Verhalten und nicht lediglich fachlicher Unsinn, wie von Wutz behauptet.

    Wutz erklärt es richtig, du lehnst es pauschal ab, weil er seinen Beitrag nicht mit Blümchen und rosa Vögelchen und ganz vielen "Bitte bitte guter qwert_zuiopü, hör mir zu!" verunziert.

    Ich fürchte, dein Verhalten macht für deine Sache keine gute Werbung. Siehe auch:
    http://www.tty1.net/smart-questions_de.html#keepcool
    http://www.tty1.net/smart-questions_de.html#not_losing


Anmelden zum Antworten