2017-12-15 4 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. 마찬가지로이 아래 라인

    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; 
} 

편집 : 나는 내 메인 컴퓨터에 내가 실수 대답에 대해 사과하지 않았다. 이 코드는 1 명의 사용자를 읽는 데 적합합니다.

+0

'scanf ("% s", & username);'응? (힌트 : 이미 포인터입니다 ...) –

+0

포인터를 선언하고 메모리를 할당하지 않았습니다. 예 : signup() 함수의'char * username;' – Sudhee

+0

내 부분에 대한 감독이었습니다. 코드를 올바른 방법으로 작성했습니다 –