Benötige Erklärung für char me [20]; --- Anfängerprobleme ---


  • Mod

    Wutz schrieb:

    scanf("%*s", size, string);
    

    Nein, das geht so nicht.

    Oh, stimmt. Ich lösch das mal, bevor es noch jemand übernimmt.



  • OK, habe den ersten Parameter vergessen 😞
    Habe den Beitrag daher nacheditiert...



  • Wutz schrieb:

    enum {SLEN=20};
    char me[SLEN];
    

    Welchen Vorteil bringt es die 20 als enum zu initialisieren und nicht als #define?


  • Mod

    Mz schrieb:

    Welchen Vorteil bringt es die 20 als enum zu initialisieren und nicht als #define?

    #define (und ebenso fast jede andere Präprozessoranweisung) ist eine globale Textersetzung durch den Präprozessor, die vor der Übersetzung des Programms stattfindet (daher der Name Präprozessor) und sich entsprechend an keine Regel der Sprache C hält. Ein enum ist hingegen ein Feature der Sprache C und bei der Übersetzung des Programms wird von dem enum die Struktur logische des Programms respektiert. In erster Linie, heißt dies, dass das enum einen Gültigkeitsbereich hat, auf den es beschränkt ist. Also kann es keine bösen Überraschungen geben, wenn irgendwo ganz woanders im Programm das Wort "SLEN" vorkommt und dieses dann vom Präprozessor ersetzt wird.



  • In diesem speziellen Fall? Keinen wirklichen.
    Schreibt man aber nur enum { SLEN }; , so ist SLEN wenigstens 0 . Bei der Makro-Variante ist #define SLEN im wahrsten Sinne nichts. Für echte Zahlenwerte kann sich ein enum gegenüber einem #define schon mal eher anbieten, da die Bezeichner auch ohne sonstige Definition eine Zahl repräsentieren.



  • und ein enum istm, so wie das #define, kein ValueType wie es z.B.

    const int SLEN = 20;
    

    wäre - es kann keinen Platz einnehmen - die const Varianten könnte/dürfte Platz brauchen

    und mit enum muss man auch keine Vor-Sicherungs-Cast alla
    #define SLEN ((int)20) machen - um an jeder Stelle zu garantieren welchen Typ sich der Kompiler an der jeweiligen Stelle sich als passend erdenkt


  • Mod

    Gast3 schrieb:

    und mit enum muss man auch keine Vor-Sicherungs-Cast alla
    #define SLEN ((int)20) machen - um an jeder Stelle zu garantieren welchen Typ sich der Kompiler an der jeweiligen Stelle sich als passend erdenkt

    Häh? 20 ist immer vom Typ int.

    Und selbst wenn das Literal zu groß für einen int ist (womit es dann vom Typ long int oder long long int wäre), würde dir ein Cast in dem Fall auch nicht helfen, sondern ganz im Gegenteil einen Überlauf stillschweigend unter den Teppich kehren.



  • Hä... mein Lehrer meinte folgendes wäre richtig:

    #include <stdio.h>
    
    int main()
    
    {
        char me[20];
        printf("Wie heissen sie?");
        scanf("%s", &me);
        printf("Hallo %s", me);
    
        return 0;
    
    }
    

    --------------

    Er ist für's Fach Hardwareentwicklung zuständig bei uns. Er kann auch Assembler programmieren... C kann er auch programmieren, aber nun ja... ich nehme an, dass er in "Embedded C" (wegen Hardwareentwicklung) programmiert.

    Der Pointer würde fehlen, behauptet mein Klassenvorstand, ansonsten ist alles richtig. Anschließend zeigte er mir eine Seite mit dem Tutorial "scanf" und er hatte tatsächlich recht, der Pointer fehlt. Ebenfalls behauptet er, dass scanf immer einen Pointer benötigt.

    Er unterrichtet in der anderen Abteilung "Elektrotechnik" auch das Fach FSST (Fachspezifische Softwaretechnik). Aber denen fehlen ein paar Themen...

    Aber ob er auch in der Abteilung Elektronik/Technische Informatik das unterrichtet, weiß ich ehrlich gesagt nicht... immerhin machen wir "FSST" genauer durch als die in der Abteilung "Elektrotechnik". (Annahme, dass er nicht alles weiß über das Fach im FSST).
    Im Gegensatz zu unserer Abteilung haben die Hardwareentwicklung noch genauer.

    Falls jemand wissen will, was das für eine Schulform ist, dann kann ich euch es beantworten. Es ist eine HTL, diese Schulform gibt es ausschließlich in Österreich.

    Hauptfrage: Ist das Programm sauber bzw. richtig? (Hier gibt's ja schließlich einige SW-Entwickler.)



  • Sag mal, hast du dir die vorigen Richtigstellungen durchgelesen?
    Hast du nicht, denn sonst würdest du nicht die unsinnigen Behauptungen deiner "Experten" nochmals wiederholen.
    Deine "Experten" haben keine Ahnung.
    nochmal (und letztmalig):
    - bei längeren Worten als 19 Zeichen hat dein Programm UB
    - bei mehreren durch whitespaces getrennten Worten wird nur das erste ausgewertet

    • "&"me bei scanf ist UB


  • FSST = Fachspezifische Softwaretechnik ; HWE = Hardwareentwicklung
    -----------------------------------------------------------------------------
    Na ja... ich habe meinen HWE-Lehrer nachgefragt.
    Das was ich nachgefragt und geschrieben habe, war nur aus dem Buch.

    Meinen HWE-Lehrer habe ich nämlich gestern gefragt (zum ersten Mal)... der meinte es sei falsch und mir fehle LEDIGLICHein "Pointer" bei scanf... der Rest sei richtig.
    Er ist auf jeden Fall ein Experte in Elektrotechnik... aber in der SW-Abteilung wohl eher nicht so.

    -----------------------------------------------------------------------------
    Das Buch "C Primer Plus" habe ich mir bereits bestellt, müsste morgen oder übermorgen ankommen...

    Ich konnte so ziemlich vieles nicht an deiner Erklärung verstehen. Sieht ziemlich kompliziert für ne Richtigstellung aus... so ziemlich alles geändert. 😃 Wörter wie Wörter: whitespaces... oder sowas nie gehört.
    -----------------------------------------------------------------------------

    Mein HWE-Lehrer meint auch, "void" sei immer überflüssig und man kann es immer leer lassen. Also was ich damit meine ist:

    int main(void)
    

    Falls es nicht überflüssig ist, dann wäre es nett, wenn es jemand mir begründen könnte.

    Mein FSST-Professor schrieb es hingegen mit "void" und begründete es auch (in einer Word-Datei - hab die Datei nicht mehr), welches heißt: "Die Anatomie eines ANSI-C Programmes"<- Diese Datei habe ich mir vom Server mitheruntergeladen, obwohl ich eigentlich nur die Erklärungvideos für meinen eigenen Stoff benötigte. (Ich bin der ersten Klasse und das war eine Worddatei von der dritten Klasse.)

    ---------------------------
    Wir haben noch nicht die Programmiersprache "C" und programmieren auch überhaupt noch nicht... sondern haben theoretische Informatik. In C programmieren wir erst im dritten Jahr. Aber natürlich mit unserem FSST-Lehrer.



  • Wutz schrieb:

    Sag mal, hast du dir die vorigen Richtigstellungen durchgelesen?
    Hast du nicht, denn sonst würdest du nicht die unsinnigen Behauptungen deiner "Experten" nochmals wiederholen.
    Deine "Experten" haben keine Ahnung.
    nochmal (und letztmalig):
    - bei längeren Worten als 19 Zeichen hat dein Programm UB
    - bei mehreren durch whitespaces getrennten Worten wird nur das erste ausgewertet

    • "&"me bei scanf ist UB

    Was ist "UB"? Was sind "whitespaces"?

    Btw: Hab so ziemlich alles nicht an deiner Richtigstellung verstanden, außer dass mein Buch wirklich Schrott ist und ich lese es nicht mehr weiter, weil es fehlerhaft ist. (morgen/übermorgen müsste mein Buch ankommen)



  • Wutz schrieb:

    Die einzig korrekte Lösung wäre

    char me[20]; /* Definition von Speicherplatz für einen max. 19 Zeichen langen C-String */
       printf("Wie heissen sie?");
       scanf("%19[^\n]", me); /* liest max. 19 Zeichen, '\0' wird immer angehängt */
       while( getchar()!='\n' ); /* leert alle nicht gelesenen Zeichen inkl. des bei scanf immer terminierenden vorhandenen '\n' aus stdin, damit folgende stdin-Operationen keinen Schaden nehmen */
    

    Beachte die while-Schleife danach, die wird von 99% aller Tutorials/Bücher und 100% aller Anfänger hier im Forum ignoriert.

    Hab weder Ahnung von: while-Schleifen, getchar, stdin-Operatoren.......
    Also kann ich auch jz nicht wirklich was verstehen. Ohhhhh... mir ist jetzt die %19 aufgefallen. 😃


Anmelden zum Antworten