Programm überspringt erste Benutzereingabe
-
Bei
fgets
kannst du die Länge vom char-Array angeben, dafgets
die '\0' mit berücksichtigt. (Also bei dir 20 bzw. 50)
Das ist anders als bei scanf. (Ist ja auch eine andere Funktion)
Telefonnummern und Postleitzahlen sind keine Integer. (Vor etwas über 20 Jahren hatten auch deutsche Postleitzahlen kurzzeitig Buchstaben)
Und brauchst du wirklich die ganzen globalen Variablen?
Nein, brauchst du nicht.
Schon gar nicht welche mit so allgemeinen Namen wiec
odertmp oder [c]name
.
[/c]
Du solltest auch statt des erstenstrcat
(Zeile 34) einstrcpy
nehmen.
-
was spricht dagegen, eine plz als unsigned einzulesen?
-
-
hmmm.. schrieb:
was spricht dagegen, eine plz als unsigned einzulesen?
Es ist (trotz des Namens) keine Zahl, sondern eine Ziffernfolge. Großer und wichtiger Unterschied. Ebenso: Telefonnummern, Kontonummern, ISBN und ähnliches.
Verschiedene Faustregeln, was eine Zahl ist und was nicht:
1. Hat die Differenz zweier dieser Objekte eine anschauliche Bedeutung? Ja? -> Sicher eine Zahl. Nein? -> Wahrscheinlich keine Zahl
2. Kann man das Objekt in einem anderen Zahlensystem ausgeben und es hätte noch die gleiche Bedeutung? Ja?-> Wahrscheinlich eine Zahl. Nein -> Sicher keine Zahl
3. Sind führende Nullen von Bedeutung? Ja? -> Sicher eine Ziffernfolge. Nein? -> Keine Aussage
-
Mit Postleitzahlen wird selten addiert oder subtrahiert.
Dann wie Dirk schon andeutete, international sieht man auf solche "PLZ": F-2... oder I-6... oder D-87654
Weiteres Problem alte Compiler mit z.B. 16bit müssen sorgfältig bei 5 und mehrstelligen ZIP-Codes programmiert werden. Das ist aber kleinste Problem. Das wird sich wahrscheinlich in den kommenden Jahren "selbst" lösen.
-
Mein Beitrag ist teilweise schon wieder Schnee von gestern:
http://de.wikipedia.org/wiki/Ländercodes_im_Briefdienst
-
Erstmal danke für die vorschläge, wo sollte ich denn die PLZ dann lieber speichern, in nem char array??
Die Ganzen globalen variablen brauche ich weil sie in jeder funktion gebraucht werden so brauch ich sie nicht dreifach deklarieren bzw initialisieren.ich hab das aus newline zeichen jetzt mit der fußgesteuerten schleife gelöst in dem ich nur bis \n einlese.Soweit funktioniert auch alles super nur eine funktion beendet nicht mit 0, obwohl alles sie alle tätogkeiten erledigt.sieht eventuell jemand was da los ist??#include<stdio.h> #include<stdlib.h> #include<string.h> FILE *datei; char pfad[75]= "/home/alex/scaffold/src/Verwaltung/"; char name[50]= ""; char tmp[20]; char c; char *fehler; unsigned long size; struct adressen{ int telnummer; int PLZ; char vname[20]; char nname[20]; char strasse[50]; char wohnort[50]; } daten; int set(void); int show(void); int kill(void); int overkill(char * name); int main(){ int choice; printf("\t\t\tAdressverwalter\n"); printf("\n\nOptionen\n"); printf("\nAdressen hinzufuegen.....: 1\nAdresse anzeigen.........: 2\n"); printf("Adresse loeschen.........: 3\nBeenden..................: 4\n"); printf("Ihre Auswahl Bitte: "); do { scanf("%i",&choice); } while ( getchar() != '\n' ); switch(choice){ case 1 : set(); break; case 2 : show(); break; case 3 : kill(); break; case 4 : return EXIT_SUCCESS; } } int set(void){ printf("Vornamen: "); fgets(daten.vname,19,stdin); printf("Nachnamen: "); fgets(daten.nname,19,stdin); strcpy(name,daten.vname); strcat(name, daten.nname); strcat(name, ".txt"); strcat(pfad, name); datei=fopen(pfad, "w+"); if(datei==NULL){ printf("Konnte %s nicht erstellen!!!\n", pfad); return EXIT_FAILURE; } else{ fputs(daten.vname, datei); fputs(daten.nname,datei); printf("Wohnort: "); fgets(daten.wohnort,49,stdin); fputs(daten.wohnort,datei); printf("Straße: "); fgets(daten.strasse,49,stdin); fputs(daten.strasse,datei); printf("PLZ: "); scanf("%d", &daten.PLZ); fprintf(datei, "%i", daten.PLZ); fclose(datei); return EXIT_SUCCESS; } } int show(void){ printf("Vornamen: "); fgets(name, 49, stdin); printf("Nachnamen: "); fgets(tmp, 19, stdin); strcat(name,tmp); strcat(name, ".txt"); strcat(pfad, name); datei =fopen(pfad, "r"); while((c=getc(datei)) != EOF){ putc(c,stdout); } } int kill(void){ printf("Vornamen: "); fgets(name, 29, stdin); printf("Nachnamen: "); fgets(tmp, 14, stdin); strcat(name,tmp); strcat(name, ".txt"); strcat(pfad, name); overkill(pfad); } int overkill(char *name){ FILE *rem=fopen(name,"w+b"); if(rem==0){ printf("Konnte datei nicht oeffnen!!!\n"); return EXIT_FAILURE; } else{ fseek(rem, 0L, SEEK_END); size=ftell(rem); fwrite((char *)'\0', 1, size, rem); fclose(rem), remove(name); } }
-
Sorry, ich hab in der ganzen euphorie vergessen zusagen an welche funktion das problem ist. es ist die show() option die dafür sorgt das der inhalt der datei auf den bildschirm ausgegeben wird.
nochmal sorry
-
negaduck schrieb:
Erstmal danke für die vorschläge, wo sollte ich denn die PLZ dann lieber speichern, in nem char array??
Ja, klingt gut.
Die Ganzen globalen variablen brauche ich weil sie in jeder funktion gebraucht werden so brauch ich sie nicht dreifach deklarieren bzw initialisieren.
Faulheit ist ein ganz schlechtes Argument, vor allem da du dir damit mittelfristig viel mehr Arbeit machst.
Soweit funktioniert auch alles super nur eine funktion beendet nicht mit 0, obwohl alles sie alle tätogkeiten erledigt.sieht eventuell jemand was da los ist??
Alle deine Funktionen haben int als Rückgabewert, aber kein return. Daraus folgt undefiniertes Verhalten (d.h. auf Deutsch: Ganz schlimm!). Ein implizites
return 0;
gibt es nur in der besonderen Funktion main und erst ab dem C99-Sprachstandard (d.h. zum Beispiel nicht im Standardmodus vieler Compiler und beim Microsoftcompiler überhaupt nicht). Warum geben deine Funktionen überhaupt int zurück, was soll das anzeigen?
-
ohh man was ist denn heute für ein tag, normalerweise sollte es eine if verzwiegung geben die auf das eventuell nicht erfolgreiche öffnen der datei mit return EXIT_FAILURE reagiert.aber irgendwie schein ich es hier verplempert zu haben das es reinzuschreiben -.-. aber ist schon geändert.und das war auch der fehler,ist ja auch klar.tausend dank