Hab gleich Prüfung: Was ist hier falsch? Zeiger auf array?
-
HI Leute, wie aus der überschrift zu entnehmen hab ich gleich Prüfung und wollte noch mal ein Programm mit Zeiger auf Array schreiben. Das Programm soll einfach eine beliebige anzahl zufälliger zeichen erstellen und in einer datei ausgeben.
#include <stdio.h> #include <time.h> void UP(int i, char passwort){ char *zeiger=&passwort; char zeichen; int zufall; zufall=(rand()%87)+33; zeichen=zufall; int j; for(j=0;j<=i-1;j++){ zeiger+=i; *zeiger=zeichen;} } main () { srand(time(NULL)); char passwort[100]; int anz; FILE *Datei; printf("Gewünschte Zeichenanzahl des Passworts:"); scanf("%i",&anz); UP(anz,&passwort); passwort[anz+1]='\0'; Datei=fopen("PW","w"); fprintf(Datei,"%s",&passwort); fclose(Datei); system("PAUSE"); }
Hoffe auf schnelle Hilfe.
LG Manuel
-
Da habt ihr aber eine schöne Aufgabe bekommen.
Frag doch einen Compiler, der weiß ganz genau, was daran falsch ist.
-
Ein Arrayname zerfällt außer bei 4 HIER NICHT relevanten Ausnahmen in C immer in einen Zeiger auf das 1. Element des Arrays.
#include <stdio.h> #include <time.h> void UP(int i, char passwort[100] ){ int j; for(j=0;j<i;j++) passwort[j]=(rand()%87)+33; } int main () { char passwort[100]; int anz; FILE *Datei; srand(time(NULL)); printf("Gewünschte Zeichenanzahl des Passworts:"); scanf("%i",&anz); UP(anz,passwort); passwort[anz]='\0'; Datei=fopen("PW","w"); fprintf(Datei,"%s",passwort); fclose(Datei); return 0; }
Vergiß nicht zu antworten, welche Note ich erreicht habe.
-
Ich hab mal nen bisschen dran rumgebastelt:
#include <stdlib.h> #include <stdio.h> #include <time.h> void UP(int len, int maxlen, char *zeiger) { int j; for(j = 0; j < len && j < maxlen; j++) { zeiger[j] = (rand()%87)+33; } zeiger[j+1] = '\0'; } int main (void) { char passwort[100]; int anz; FILE *Datei; srand(time(NULL)); printf("Gewünschte Zeichenanzahl des Passworts:"); scanf("%i",&anz); UP(anz, 100, passwort); Datei=fopen("PW.txt","w"); fprintf(Datei,"%s",passwort); fclose(Datei); return EXIT_SUCCESS; }
-
danke euch schon mal. Aber:
Neee, ist keine Klausuraufgabe, ist ne Übungsaufgabe für vorher. Wahrscheinlich kommen gar keine Zeiger auf Arrays vor, will mich aber nicht auf 'wahrscheinlich' verlassen. Deshalb wollte ich das mal mit besagtem lösen.
@Wutz: Deine Lösung ist zwar richtig aber ich wollte es auf dem zeiger auf array weg probieren.
Das wusste ich sogar, deshalb hab ich für jeden schleifen durchlauf des Unterprogramms die adresse des zeigers addiert. Was, wie ich es grad gesehen habe,eh falsch war. Hier noch mal verbessert, aber immernoch nicht lauffähig:
#include <stdio.h> #include <time.h> void UP(int i, char passwort[100]){ char *zeiger=passwort; char zeichen; int zufall; zufall=(rand()%87)+33; zeichen=zufall; int j; for(j=0;j<=i-1;j++){ if(j>0){ zeiger++;} *zeiger=zeichen;} } main () { srand(time(NULL)); char passwort[100]; int anz; FILE *Datei; printf("Gewünschte Zeichenanzahl des Passworts:"); scanf("%i",&anz); UP(anz,passwort[100]); passwort[anz+1]='\0'; Datei=fopen("PW","w"); fprintf(Datei,"%s",&passwort); fclose(Datei); system("PAUSE"); }
LG Manu
EDIT: @gary1195: hatte deine antwort noch gar nicht gesehen sry. Danke das muss ich mir nochmal genauer angucken.
Kann mir einer sagen warum meins nicht will?
-
Keine ahnung was deiner sagt aber mein compiler mein dazu:
test2.c: In Funktion »UP«: test2.c:8:6: Warnung: Implizite Deklaration der Funktion »rand« [-Wimplicit-function-declaration] test2.c: Auf höchster Ebene: test2.c:17:1: Warnung: Rückgabetyp ist auf »int« voreingestellt [-Wreturn-type] test2.c: In Funktion »main«: test2.c:19:3: Warnung: Implizite Deklaration der Funktion »srand« [-Wimplicit-function-declaration] test2.c:25:3: Warnung: Übergabe des Arguments 2 von »UP« erzeugt Zeiger von Ganzzahl ohne Typkonvertierung [standardmäßig aktiviert] test2.c:4:6: Anmerkung: »char *« erwartet, aber Argument hat Typ »char« test2.c:28:3: Warnung: Format »%s« erwartet Argumenttyp »char *«, aber Argument 3 hat Typ »char (*)[100]« [-Wformat] test2.c:30:3: Warnung: Implizite Deklaration der Funktion »system« [-Wimplicit-function-declaration] test2.c:31:1: Warnung: Kontrollfluss erreicht Ende von Nicht-void-Funktion [-Wreturn-type]
das kannst du ja erstmal abarbeiten
am besten inculdierst du schon mal stdlib.h
-
YEAR!!!!! LÄUFT!
Danke euch Tausendmal hab keins von euch übernommen sondern meins umgebaut. Ihr seid Klasse!
Hier noch mal was läuft:
#include <stdio.h> #include <time.h> #include <stdlib.h> void UP(int i, char *zeiger){ char zeichen; int zufall; int j; for(j=0;j<=(i-1);j++){ zufall=(rand()%87+33); zeichen=zufall; if(j>0){ zeiger=zeiger+1;} *zeiger=zeichen;} } main () { srand(time(NULL)); char passwort[100]; int anz; FILE *Datei; printf("Gewünschte Zeichenanzahl des Passworts:"); scanf("%i",&anz); UP(anz,passwort); passwort[anz+1]='\0'; Datei=fopen("PW.txt","w"); fprintf(Datei,"%s",&passwort); fclose(Datei); system("PAUSE"); }
-
- inkonformes C89
- inkonformes C99
- UBBei mir würdest du wieder antanzen müssen und dein Ticket nur bekommen, wenn du mir das UB in deinem "laufenden" Code zeigst und erklären kannst.
-
@Wutz:
hmmmm, was ist eigentlich "UB" ?
-
Undefined behavior.
-
glückspirat schrieb:
YEAR!!!!! LÄUFT!
Trotzdem hast du es nicht verstanden.
Zeile 26, 38 und 30 sind immer noch falsch.
-
scanf("%i",&anz);
=>
scanf("%d", &anz); // %d
und
fprintf(Datei,"%s",&passwort);
=>
fprintf(Datei, "%s", passwort); // ohne &
Habs aber nicht getestet. Was daher an passwort[anz+1]='\0'; falsch sein soll, konnte ich jetzt nicht überprüfen. Zähl einfach mal nach, ob die Anzahl der Stellen korrekt ist. Ansonsten setzt du den Terminator ein Zeichen zu früh.
-
hhhh schrieb:
Habs aber nicht getestet. Was daher an passwort[anz+1]='\0'; falsch sein soll, konnte ich jetzt nicht überprüfen. Zähl einfach mal nach, ob die Anzahl der Stellen korrekt ist. Ansonsten setzt du den Terminator ein Zeichen zu früh.
Wegen
char passwort[100];
sollte anz natürlich kleiner als 100 sein, ausserdem gehört die Null an die
Stelle anz, da das Feld bei 0 anfängt.Der Murks ist auch seltsam.
for(j=0;j<=(i-1);j++){ zufall=(rand()%87+33); zeichen=zufall; if(j>0){ zeiger=zeiger+1;} *zeiger=zeichen;} }
besser:
for(j=0; j<i; j++, zeiger++){ zeichen=(rand()%87+33); *zeiger=zeichen; } *zeiger=(char)0;
oder sofort:
for(j=0; j<i; j++, zeiger++){ *zeiger=(char)(rand()%87+33); } *zeiger=(char)0;