2017-12-15 10 views
-1

私はすでに以前に尋ねたことがありましたが、私は思っていましたが(私は初心者ですので、物語が水に落ちます)誰も助けることができますか?私はそれ(宿題)を送信するために、いくつかのより多くの時間を持っていると私はちょうど私がたくさんのさまざまな方法を試してみました命令 シンプルファイルのログインプログラムでサインアップ中にエラーが発生しました

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

int signIn(char username[30], char pass[30]){ 

FILE *p; 
char user2[30], pass2[30]; 

p = fopen("users.txt", "r+"); 


fscanf(p,"%s\n%s",user2,pass2); 

if((strcmp(username,user2)==0) && (strcmp(pass,pass2)==0)) 
    printf("\nUser and password correct!!!"); 
else 
    printf("\nUser or password incorrect!\n\n"); 

printf("\n\n"); 

fclose(p); 
return 0; 
} 

int signUp(char username[30], char pass[30], char fullName[30]) { 

FILE *p; 
p = fopen("users.txt", "r+"); 

printf("Username: "); 
scanf("%s", &username); 

printf("Password: "); 
scanf("%s", &pass); 

printf("Full name: "); 
scanf("%s", &fullName); 

fprintf(p, "%s\n%s\n%s", username, fullName, pass); 

fclose(p); 
return 0; 
} 

int main(){ 
char username[30], pass[30], fullName[30]; 
int choose; 

printf("Welcome to student login system!\n"); 
printf(" 1: Sign in\n 2: Sign up\n"); 
printf("--------------------------------\n"); 
scanf("%d", &choose); 

if(choose==1) { 
    printf("\nUser:"); 
    scanf("%s",username); 
    printf("\nPassword:"); 
    scanf("%s",pass); 
    signIn(username, pass); 
} 

if(choose==2) { 

    signUp(username, pass, fullName); 

} 

} 

を欲しがるために、私のためにそれを行うために誰かを聞かないと、私は今、本当に困惑しています。

+0

サインインが正しいかどうかを確認するときは、「users.txt」のすべての行を読む必要があります。現在、ファイルの最初の行だけをチェックしています。 – markgz

+0

あなたはサインアップでどのようなエラーが発生しますか – JoshKisb

+0

フルネームプログラムを入力した後、@ JoshKisbは働いていません。私はfprintf(p、 "%s \ n%s \ n%s"、username、fullName、pass)と思います。 – jovkm

答えて

1
  1. scanf("%s", &username);が正しくありません。 scanf("%s", &username[0]);特に配列/ポインタが関与している場合、警告に集中する必要があります。
  2. 同様に2行

    scanf("%s", &pass[0]); scanf("%s", &fullName[0]);

  3. fprintf(p, "%s\n%s\n%s", username, fullName, pass);あなたがセカンドラインとしてフルネームを書きますが、読みながら下には、パスワードのように2行目を読んで。従ってfprintf(p, "%s\n%s\n%s", username, pass,fullName);
  4. ファイルを開いた後、ファイルポインタの有効性をチェックしなければなりません。何らかの理由でNULLを返すと、プログラムがクラッシュします。代わりに、単にO/Pをコンパイルして取得しようとすると、この単純なコードをデバッグするための最良の方法は、ペンと紙で座っている

、各ライン

0

そのものの数で何が起こるかを分析してみてくださいあなたのコードが私のところに飛び出して間違っています。私は可能な限り修正しようとした。次は動作するはずです。

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

int signIn(char username[], char pass[]) { 
    FILE *p; 
    char user2[30], pass2[30], fullName[50]; 

    if (!(p = fopen("users.txt", "r+"))) { 
     printf("Could not read from users.txt file\n"); 
     fclose(p); 
     return 1; 
    } 

    int ret = 2; 
    while (fgets(user2, 30, p) != NULL) { 
     fgets(pass2, 30, p); 
     fgets(fullName, 50, p); 
     // you have written the fullName to the file as a third line, so you must check for this too 
     if ((strcmp(username, user2) == 0) && (strcmp(pass, pass2) == 0)) { 
      printf("\nUser and password correct!!!\n"); 
      printf("Logged in as %s", fullName); 
      ret = 0; 
      break; 
     } 
    } 

    if (ret == 2) 
     printf("\nUser or password incorrect!\n"); 

    printf("\n\n"); 
    fclose(p); 
    return ret; 
} 

int signUp(void) { 
    FILE *p; 
    char username[30], pass[30], fullName[50]; 

    if (!(p = fopen("users.txt", "w+"))) { 
     printf("Could not write to users.txt file\n"); 
     fclose(p); 
     return 1; 
    } 

    printf("Username: "); 
    fgets(username, 30, stdin); 

    printf("Password: "); 
    fgets(pass, 30, stdin); 

    printf("Full name: "); 
    fgets(fullName, 50, stdin); 

    fprintf(p, "%s%s%s", username, pass, fullName); 
    printf("You have signed up!\n"); 
    fclose(p); 
    return 0; 
} 

int main(void) { 
    char username[30], pass[30]; 
    int choose; 

    printf("Welcome to student login system!\n"); 
    printf(" 1: Sign in\n 2: Sign up\n"); 
    printf("--------------------------------\n"); 
    scanf("%d", &choose); 
    getchar(); 

    if (choose == 1) { 
     printf("User: "); 
     fgets(username, 30, stdin); 
     printf("Password: "); 
     fgets(pass, 30, stdin); 
     return signIn(username, pass); 
    } 
    else if (choose == 2) { 
     return signUp(); 
    } 
    return 0; 
} 

EDIT:私はずさんな答えをお詫び申し上げます、私は私のメインのコンピュータにありませんでした。このコードは1人のユーザーの読書に役立ちます。

+0

'scanf("%s "、&username);'ハァッ?? (ヒント:既にポインタです...) –

+0

あなたはポインタを宣言し、メモリを割り当てませんでした。例signup()関数内の 'char * username;'の例 – Sudhee

+0

私の一部の見落としであった。コードを正しく書いた –

関連する問題