Frage bezüglich NULL und Zeiger



  • Das soll eine einfach verkettete Liste sein.

    Beachte, das Zeile 39 auch noch zur Schleife gehört.
    (Da täuscht die Einrückung)

    Im übrigen sind Postleitzahlen keine Ganzzahlen.



  • Detlef7able schrieb:

    Wann ist denn die while Schleife beendet?

    Wenn pointer gleich NULL ist.
    Dafür wird irgendwann (hoffentlich) die Instruktion in Zeile 39 sorgen.



  • Ist das echt so im Buch?
    Das ist ja nicht nur unschön, sondern einfach falsch.

    Was um alles in der Welt ...


  • Mod

    wth schrieb:

    Ist das echt so im Buch?
    Das ist ja nicht nur unschön, sondern einfach falsch.

    Was um alles in der Welt ...

    Die vielen Warnungen vor dem Buch in diesem Forum sind keinesfalls übertrieben. Das mit dem "man wird dümmer, wenn man es liest" ist absolut ernst gemeint. J.W. bringt einem falsches C bei¹ und man muss es dann mühsam wieder verlernen und dann wieder richtig neu lernen.

    ¹: Das gilt natürlich auch für all die anderen Sprachen, über die er Bücher geschrieben hat. C ist sogar noch eine seiner besseren Sprachen.



  • Gut werde das Buch nicht mehr lesen. Vor einem Jahr wurde das noch hier irgendwo als Nachschlagewerk verwiesen und jetzt habe ich es zum Glück mitbekommen wie schlecht es ist.

    Habe ein anderes Beispiel (nicht aus dem Buch von Herrn Wolf)

    char xx(char *string)    
    {
    	unsigned int i;
    	while (string[0] == ' ')
    		strcpy(string, &string[1]);    
    	for (i = 0;i<strlen(string);i++)
    		string[i] = toupper(string[i]);
    	return string[0];
    }
    

    Was ist der Zweck der while Schleife mit der Anweisung?
    Ich weiß was passiert, kann mir aber nicht denken welches Ziel verfolgt wird.
    Vielleicht ist es wichtig zu erwähnen, das der String welcher durch diese Funktion geprüft werden soll über eine scanf Eingabe erfolgt.



  • Nun sie löscht alle Leerzeichen am Anfang des Strings



  • Die Schleife soll wohl führende Leerzeichen entfernen.

    Allerdings wird das strcpy nicht richtig benutzt, da

    strcpy schrieb:

    To avoid overflows, the size of the array pointed by destination shall be long enough to contain the same C string as source (including the terminating null character), and should not overlap in memory with source.

    Die ganze Funktion ist von einem Anfänger gemacht.

    Mit welchem Formatstring für scanf wird das eingelesen?



  • #define STRLEN 10
    char eingabestring[STRLEN];
    scanf("%s",eingabestring);
    

    Die Funktion stammt aus den Beispielen eines Professors für Programmierung. Sie ist Bestandteil für ein Beispiel eines dynamischen Arrays.



  • DirkB schrieb:

    Die ganze Funktion ist von einem Anfänger gemacht.

    Detlef7able schrieb:

    Die Funktion stammt aus den Beispielen eines Professors für Programmierung.

    Das schließt sich gegenseitig nicht aus - im Gegenteil - es bedingt sich.
    Wie schon erwähnt, ist der Professorenschrott UB, scanf überliest allein schon alle führenden Leerzeichen gemäß Standard, und obendrein provoziert dein Professorenschrottcode auch noch einen Pufferüberlauf, korrekt wäre einzig und allein

    #define STRLEN 10
    char eingabestring[STRLEN];
    scanf("%9s",eingabestring);
    

    Leg nicht nur das Pfuscherbuch beiseite sondern auch das Laiengefasel deines Professors.



  • In einem String, der mit %s bei scanf eingelesen wird, gibt es keine Leerzeichen.

    http://en.cppreference.com/w/c/io/fscanf

    scanf schrieb:

    All conversion specifiers other than [, c, and n consume and discard all leading whitespace characters

    Der Professor hat keine Ahnung von C. Vergiss das Gelernte nach der Prüfung.

    Bei scanf wäre die Längenangabe für eingabestring im Formatstring erforderlich.
    (Nicht ganz einfach, aber machbar.)
    Kein Profi lässt eine for-Schleife auf i<strlen(string) prüfen sondern auf string[i]
    Verschieben und toupper lässt sich in einem Durchgang erledigen.


Anmelden zum Antworten