Habe ein Problem

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
lolliger
Beiträge: 36
Registriert: Sa Mär 05, 2011 1:01 pm

Habe ein Problem

Beitrag von lolliger » Sa Mär 05, 2011 1:14 pm

Hallo, ich habe vor kurzem angefangen mit c zu programmieren und wollte jetzt mal ein eigenes Programm schreiben:

Code: Alles auswählen

#include <stdio.h>
#include <stdlib.h>
#include <string.h>



int main()
{

FILE *sprofile;
int i, a;
char pruefeN[20], pruefeP[20];

struct profildaten
{
    char name[12];
    char passwort[11];
};

struct profildaten profile[10];

struct profildaten *k;


printf("!!!Willkommen!!!\n\n\n");



for (i=0;(i!=99)&&(i!=1)&&(i!=2);)
{
    printf("Neues Profil erstellen: 1+Enter druecken\n\n");
    printf("Einloggen: 2+Enter druecken\n\n");
    printf("Beenden: 99+Enter druecken\n\n\n");
    printf("Eingabe: ");

    scanf("%d",&i);


}

if (i==1)
    {
        printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nName eingeben (höchstens 7 Buchstaben + am Ende .txt):\n");
        scanf("%s",k->name);

        printf("\nPasswort eingeben (höchstens 10 Buchstaben):\n");
        scanf("%s",k->passwort);



        sprofile = fopen(k->name,"r+");
        fputs(k->name,sprofile);
        fputs(k->passwort,sprofile);

        i=2;

    }

if (i==2)
    {
        printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nEINLOGGEN\n\n");
        printf("Name eingeben + am Ende .txt:\n");
        scanf("%s",pruefeN);

        printf("Passwort eingeben:");
        scanf("%s",pruefeP);

        sprofile = fopen(pruefeN,"r");

        fputs(k->name,stdout);
        fputs(k->passwort,stdout);d









    }



fclose(sprofile);
return 0;
}
Bis jetzt sollte man am Anfang auswählen, ob man das Programm beenden will, ein neués Profil erstellen, oder sich einloggen will.Das klappt auch.
Das Prifil wird dann unter einem Namen in .txt gespeichert. Das klappt auch.
Aber wenn ich mich nach einem Neustart "einloggen" will, liest das Programm die gespeicherten Daten nicht richtig!!! :cry:

Kann mir jemand helfen?

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Habe ein Problem

Beitrag von Xin » Sa Mär 05, 2011 2:10 pm

lolliger hat geschrieben:Hallo, ich habe vor kurzem angefangen mit c zu programmieren und wollte jetzt mal ein eigenes Programm schreiben:
Das scheint soweit ja schonmal geklappt haben. ^^

Aaaalso... als erstes solltest Du sauber einrücken. Nach jeder öffnenden Klammer rückst Du den Code ein und wieder zurück, wenn Du eine Klammer schließt.

Das erste, was mir auffällt ist folgende:

Code: Alles auswählen

xin@trinity:~/proggen.org/lollinger$ ./a.out 
!!!Willkommen!!!


Neues Profil erstellen: 1+Enter druecken

Einloggen: 2+Enter druecken

Beenden: 99+Enter druecken


Eingabe: 99
Speicherzugriffsfehler
xin@trinity:~/proggen.org/lollinger$ 
lolliger hat geschrieben:Bis jetzt sollte man am Anfang auswählen, ob man das Programm beenden will, ein neués Profil erstellen, oder sich einloggen will.Das klappt auch.
Das Prifil wird dann unter einem Namen in .txt gespeichert. Das klappt auch.
Ich widerspreche. ^^

Code: Alles auswählen

xin@trinity:~/proggen.org/lollinger$ ./a.out 
!!!Willkommen!!!


Neues Profil erstellen: 1+Enter druecken

Einloggen: 2+Enter druecken

Beenden: 99+Enter druecken


Eingabe: 1























Name eingeben (höchstens 7 Buchstaben + am Ende .txt):
xin.txt

Passwort eingeben (höchstens 10 Buchstaben):
Speicherzugriffsfehler
xin@trinity:~/proggen.org/lollinger$ 
lolliger hat geschrieben:Aber wenn ich mich nach einem Neustart "einloggen" will, liest das Programm die gespeicherten Daten nicht richtig!!! :cry:

Kann mir jemand helfen?
Das Programm macht bei mir hier eine Menge Zeug, was nicht nachvollziehbar ist.

Was passiert? Du hat einen Zeiger:

Code: Alles auswählen

  struct profildaten *k;
den Du benutzt:

Code: Alles auswählen

    printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nName eingeben (höchstens 7 Buchstaben + am Ende .txt):\n");
    scanf("%s",k->name);

    printf("\nPasswort eingeben (höchstens 10 Buchstaben):\n");
    scanf("%s",k->passwort);
aber nie initialisiert. Name wird also irgendwo ins Nirwana geschrieben und daraufhin explodiert das Programm.

Es gibt noch weitere Fehler (zum Beispiel, dass das Programm abschmiert, wenn man es einfach beendet) ^^


Achja... willkommen im Forum. :-)
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

lolliger
Beiträge: 36
Registriert: Sa Mär 05, 2011 1:01 pm

Re: Habe ein Problem

Beitrag von lolliger » Sa Mär 05, 2011 3:11 pm

Aaaalso... als erstes solltest Du sauber einrücken. Nach jeder öffnenden Klammer rückst Du den Code ein und wieder zurück, wenn Du eine Klammer schließt.
Das mit dem Einrücken habe ich schonmal gemacht:

Code: Alles auswählen

#include <stdio.h>
#include <stdlib.h>
#include <string.h>



int main()
{

    FILE *sprofile;
    int i;
    char pruefeN[20], pruefeP[20];

    struct profildaten
    {
        char name[12];
        char passwort[11];
    };

    struct profildaten profile[10];

    struct profildaten *k;


    printf("!!!Willkommen!!!\n\n\n");



    for (i=0;(i!=99)&&(i!=1)&&(i!=2);)
    {
        printf("Neues Profil erstellen: 1+Enter druecken\n\n");
        printf("Einloggen: 2+Enter druecken\n\n");
        printf("Beenden: 99+Enter druecken\n\n\n");
        printf("Eingabe: ");

        scanf("%d",&i);


    }

    if (i==1)
    {
        printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nName eingeben (höchstens 7 Buchstaben + am Ende .txt):\n");
        scanf("%s",k->name);

        printf("\nPasswort eingeben (höchstens 10 Buchstaben):\n");
        scanf("%s",k->passwort);



        sprofile = fopen(k->name,"r+");


        i=2;

    }

    if (i==2)
    {
        printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nEINLOGGEN\n\n");
        printf("Name eingeben + am Ende .txt:\n");
        scanf("%s",pruefeN);

        printf("Passwort eingeben:");
        scanf("%s",pruefeP);

        sprofile = fopen(pruefeN,"r");

        fputs(k->name,stdout);
        fputs(k->passwort,stdout);

    } :




    return 0;
}
Ist gleich viel übersichtlicher!!! :D

Und den Fehler beim Beenden habe ich auch behoben.

Nur ich weiß nicht so recht, wie ich den Zeiger initialisieren soll, damit das Programm richtig läuft.

Hast du vieleicht eine Lösung??? :(

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Habe ein Problem

Beitrag von Xin » Sa Mär 05, 2011 3:37 pm

lolliger hat geschrieben:
Aaaalso... als erstes solltest Du sauber einrücken. Nach jeder öffnenden Klammer rückst Du den Code ein und wieder zurück, wenn Du eine Klammer schließt.
Das mit dem Einrücken habe ich schonmal gemacht:
Ist gleich viel übersichtlicher!!! :D
Jow, hat mir beim lesen auch geholfen.
Wäre halt besser, wenn Du es machst bevor Du es postest, dann müssen wir es nicht beide machen. ^^
lolliger hat geschrieben:Und den Fehler beim Beenden habe ich auch behoben.
Nein, Du hast nur die Datei nicht mehr geschlossen, deswegen stürzt das Programm nicht mehr ab, wenn Du keine Datei öffnest. Wenn Du eine Datei öffnest, wird sie aber nicht mehr geschlossen. Also haben wir nun einen anderen Fehler. ^^
lolliger hat geschrieben:Nur ich weiß nicht so recht, wie ich den Zeiger initialisieren soll, damit das Programm richtig läuft.
Hast du vieleicht eine Lösung??? :(
Du könntest Speicher alloziieren. Alternativ hast Du Dir ein Array von 10 Profildaten erstellt, Du könntest eins davon nehmen.

Code: Alles auswählen

k = &profile[0];
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

lolliger
Beiträge: 36
Registriert: Sa Mär 05, 2011 1:01 pm

Re: Habe ein Problem

Beitrag von lolliger » So Mär 06, 2011 9:56 am

Xin hat geschrieben:
lolliger hat geschrieben:Und den Fehler beim Beenden habe ich auch behoben.
Nein, Du hast nur die Datei nicht mehr geschlossen, deswegen stürzt das Programm nicht mehr ab, wenn Du keine Datei öffnest. Wenn Du eine Datei öffnest, wird sie aber nicht mehr geschlossen. Also haben wir nun einen anderen Fehler. ^^
Hi Xin,
Habe nochmal alles in Ruhe überdacht und die Fehler behoben. :)

Mit dem Programm kann man nun beliebig viele Profile erstellen und sich mithilfe eines selbst ausgesuchtem Passwort wieder "einloggen".
Nach dem Einloggen kann man bis jetzt das Programm aber nur beenden:

Code: Alles auswählen

#include <stdio.h>
#include <stdlib.h>
#include <string.h>



int main()
{

    FILE *sprofile;
    int i, j;
    char pruefeN[12], pruefeP[6], name[12], passwort[6];



    printf("!!!Willkommen!!!\n\n\n");


    for (i=0;(i!=99)&&(i!=1)&&(i!=2);)
    {
        printf("Neues Profil erstellen: 1+Enter druecken\n\n");
        printf("Einloggen: 2+Enter druecken\n\n");
        printf("Beenden: 99+Enter druecken\n\n\n");
        printf("Eingabe: ");

        scanf("%d",&i);
    }


    if (i==1)
    {
        printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nName eingeben (höchstens 7 Buchstaben + am Ende .txt):\n");
        scanf("%s",name);

        printf("\nPasswort eingeben Wichtig!!!: genau 5 Buchstaben:\n");
        scanf("%s",passwort);

        sprofile = fopen(name,"w");
        fputs(passwort,sprofile);

        i=2;
    }


    if (i==2)
    {
        falsch:
        printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nEINLOGGEN\n\n");
        printf("Name eingeben + am Ende .txt:\n");
        scanf("%s",pruefeN);

        printf("Passwort eingeben:\n");
        scanf("%s",pruefeP);

        sprofile = fopen(pruefeN,"r");
        fgets(passwort,11,sprofile);


        if (pruefeP[0,1,2,3,4]==passwort[0,1,2,3,4])
        {

            fclose(sprofile);


            for (j=0; (j!=99) && (j!=1) && (j!=2) ; )
            {
                printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nHallo %s,\n\nWas möchtest du tun?\n\n\n",pruefeN);
                printf("Einen Text schreiben: 1+Enter\n\n");
                printf("Einen Text lesen: 2+Enter\n\n");
                printf("Beenden: 99+Enter\n\n\n");
                printf("Eingabe: ");

                scanf("%d",&j);
            }

        }

        else
        goto falsch;
    }


    return 0;
}
Probiers mal aus! Hast du Verbesserungsvorschläge???
Und übrigens: Danke für deine Tipps!!! :D

Antworten