2017-07-16 41 views
-2

輕鬆進入程序分割錯誤,C文件處理程序

使用Linux首先的。我試圖製作一個程序,如果他沒有獲得賬戶,他將首先註冊一個用戶,然後他將被導向登錄屏幕,在那裏他將輸入他的賬戶信息,然後登錄。之後,他將提供選項以方便訪問網站等就像用戶輸入1一樣,他將被引導到f.b,2被引導到quora等等。我成功地設法編寫了程序到登錄階段,但是我在一個單一的函數中完成了它,例如main(),所以我認爲如果我有用於執行特定任務的單獨函數會很好。我這次用單獨的函數對它進行了編碼,但是當我嘗試使用fopen()打開文件時,這次我得到了分段錯誤。還請告訴我一些使用控制檯命令在瀏覽器中打開網站的方法。就像我們在Windows中一樣(例如,開始www.facebook.com)。這是代碼。

#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) { 

} 

我得到了sign_up函數第一行的錯誤信息,我打開了FILE。

enter image description here

+1

這個'scanf(「%c」);'不是你的想法。你想在哪裏存儲讀取的字符? –

+0

@SeekAddo嗯,它是一個虛擬scanf()。我將它用作gethc()函數。 – Muneeb

+0

@SeekAdoo順便說一句,它不會存儲任何被折磨的字符(如果我沒有錯),因爲我沒有指定它的位置 – Muneeb

回答

0

scanf("%c")預計所讀出的字符將被存儲的指針。 scanf()不知道你是否提供了指針,它只是從預期的堆棧位置讀取目標地址。有效地scanf()需要一個隨機地址並在那裏寫入字符。

使用getchar();char Dummy; scanf("%c",&Dummy);

+1

寫一些好書,'%* c'也是一件事情。 – melpomene

+0

@melpomene還有一件事我想問。 fgets繼續跳過輸入,因爲我按下了輸入。任何方式來解決它? – Muneeb

+0

@Muneeb從不使用'scanf'作爲用戶輸入。只使用'fgets'。 – melpomene