Frage bezüglich NULL und Zeiger
-
Guten Tag,
ich habe mir gerade aus dem Buch C von A bis Z folgenden Abschnitt angesehen:
#include <stdio.h> #include <string.h> #include <stdlib.h> #define MAX_HASH 10 #define M 31 struct plz{ char ort[255]; unsigned int postleit; struct plz *next; }; struct plz *hash_tabelle[MAX_HASH]; struct plz *insert(char *, unsigned int); void search_in_hash(char *); int hash_funktion(char *); struct plz *insert(char *o, unsigned int p) { struct plz *pointer; /* Hash-Wert (bucket) an hash_adresse (0-9) */ int hash_adresse = hash_funktion(o); /* printf("%d\n",hash_adresse); */ /* Zeiger auf errechnete Tabellenadresse * durch hash_funktion */ pointer = hash_tabelle[hash_adresse]; /* Wir suchen freien Platz für einen neuen Eintrag * in hash_tabelle[hash_adresse] */ while (pointer != NULL) { if (strcmp(o, pointer->ort) == 0) /* Stadt gleich? */ if (pointer->postleit == p) { /* Postleitzahlen gleich? */ printf("%s mit PLZ %d ist bereits vorhanden\n", o, p); /* doppelte Einträge vermeiden */ return pointer; } pointer = pointer->next; } /* Speicher für neues Element allozieren */ pointer = malloc(sizeof(struct plz)); if (pointer == NULL) { printf("Kein Speicher für neue PLZ vorhanden\n"); return NULL; } strcpy(pointer->ort, o); pointer->postleit = p; pointer->next = hash_tabelle[hash_adresse]; hash_tabelle[hash_adresse] = pointer; return pointer; } /* die Hash-Funktion zur Berechnung des Hash-Werts * eines Strings */ int hash_funktion(char *string) { unsigned int hash_adresse; unsigned char *pointer; hash_adresse = 0; pointer = (unsigned char *)string; while (*pointer != '\0') { hash_adresse = M * hash_adresse + *pointer; pointer++; } return hash_adresse % MAX_HASH; }
Für Zeile 31 bis 37 fehlt mir das Verständnis. Kann mir das nicht vorstellen.
Ich weiß das man im Array überprüfen muss ob eine gültige Adresse vorhanden ist oder so ähnlich.Wann ist denn die while Schleife beendet?
Vielen Dank im Voraus
-
Der Code ist totaler Schrott, kein Wunder, denn:
https://www.c-plusplus.net/forum/272350
Buch lieber weglegen. Du wirst aktiv dümmer, wenn du es weiter liest.
-
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 ...
-
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üreingabestring
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 undtoupper
lässt sich in einem Durchgang erledigen.