2017-07-16 2 views
-2

Einfacher Zugang ProgrammSegmentation Fehler, C Datei Hantierungsprogramm

den Einsatz von Linux in erster Linie. Ich versuche, ein Programm zu machen, das zuerst einen Benutzer anmeldet, falls er kein Konto hat, danach wird er zu einem Anmeldebildschirm geleitet, wo er seine Kontodetails eingeben wird und dann eingeloggt wird. Danach wird er wird Optionen erhalten, um einen einfachen Zugang zu Websites etc Wenn der Benutzer zum Beispiel 1 eingibt, wird er nach f.b, 2 nach quora und so weiter geleitet. Ich schaffte es erfolgreich, das Programm auf die Anmeldephase zu programmieren, aber ich tat es in einer einzigen Funktion, nämlich main(), also dachte ich, es wäre schön, wenn ich separate Funktionen zum Ausführen bestimmter Aufgaben hätte. Ich habe es diesmal in separaten Funktionen codiert, aber diesmal bekomme ich einen Segmentierungsfehler, wenn ich versuche, DATEI mit fopen() zu öffnen. Und bitte sagen Sie mir auch, wie Sie eine Website in einem Browser mit dem Konsolenbefehl öffnen können. Wie wir in Windows haben (starten Sie www.facebook.com). Hier ist der Code.

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

struct user_data { 
    char name[50]; 
    unsigned long password; 
}; 

struct user_data new_user;     // Will hold the data of new 
struct user_data data_ver;     // Will hold the data read 

void sign_up(void); 
void sign_in(void); 

int main(void) { 
    beginning:          // Beginning label in case of invalid input 
    printf("\t\t\t\t WELCOME TO EASY ACCESS APPLICATION"); 
    printf("\n\n\nIf you have an account press 1.\n\nPress 2 for sign up."); 
    char user_choice;        // Wil hold the 
    // user_choice i.e whether he wants to sign up/sign in 
    user_choice = getchar(); 
    if (user_choice == '1') { 
     sign_in();         // In case of 1 goto sign in page 
    } 
    else if (user_choice == '2') { 
     sign_up();    // Opening file); 
     // In case of 2 goto sign up page 
    } 
    else { 
     printf("Invalid input. Try again.\n\n"); 
     puts("Press any key to continue..."); 
     getchar(); 
     system("clear"); 
     goto beginning; 
    } 
    return 0; 
} 

void sign_up(void) { 
    FILE *data = fopen("data.txt", "a"); 
    if (data == NULL) { 
     printf("Unable to open file."); 
     scanf("%c"); 
     system("clear"); 
    } 
    system("clear"); 
    printf("\t\t----------------------------\n" 
      "\t\t|       |\n" 
      "\t\t|  SIGN UP PAGE   |\n" 
      "\t\t|       |\n" 
      "\t\t----------------------------"); 

    printf("\n\nName:"); 
    scanf("%c");    // Dummy scanf 
    gets(new_user.name);   // Getting name into the struct 
    printf("\nPassword."); 
    scanf("%lu", &new_user.password); // Getting pass into the struct 
    fprintf(data, "%s %lu\n", new_user.name, new_user.password);  //Feeding data into FILE 
    system("clear"); 
    printf("\n\nSign up complete. :) "); 
    printf("\n\nYou will now be directed to the sign in page. "); 
    printf("\nPress any key to contine..."); 
    scanf("%c"); 
    system("clear"); 
    fclose(data); 
} 

void sign_in(void) { 

} 

Ich bekomme den Fehler in der ersten Zeile von sign_up Funktion, wo ich FILE öffnen.

enter image description here

+1

Dieser 'scanf ("% c ");' ist nicht, was Sie denken. Wo soll scanf das gelesene Zeichen speichern? –

+0

@SeekAddo Nun, es ist ein Dummy scanf(). Ich benutze es als Gethc() -Funktion. – Muneeb

+0

@SeekAdoo Und übrigens wird es das readed char nirgendwo speichern (wenn ich nicht falsch liege), da ich seinen Standort nicht angegeben habe – Muneeb

Antwort

0

scanf("%c") erwartet einen Zeiger, wo das gelesene Zeichen gespeichert werden. scanf() weiß nicht, ob Sie den Zeiger angegeben haben, er liest nur die Zieladresse vom erwarteten Stapelspeicherort. Effektiv nimmt scanf() eine zufällige Adresse und schreibt das Zeichen dort.

Verwenden Sie getchar(); oder char Dummy; scanf("%c",&Dummy);.

+1

vorschlagen würdest. '% * C' ist auch eine Sache. – melpomene

+0

@melpomene Es gibt noch etwas, das ich fragen wollte. Das FGETS überspringt die Eingabe, weil ich Enter drücke. Irgendeine Möglichkeit, es zu lösen? – Muneeb

+0

@Muneeb Verwenden Sie niemals 'scanf' für Benutzereingaben. Verwenden Sie nur 'fgets'. – melpomene