Hey all, into phaseII with this program for my C programming class. This is basically an employee sign up/sign in program for an imaginary company. Part of my requirements are to strcat() the first and last name entered by the user to create a user ID. Upon doing this, I am getting garbage values returned. I have outlined the code with /********/ in the function allsignup(...).
My second requirement is to store the User profiles to a separate file, and then when the user goes to sign in with a user ID/ password, to open the file and read the profiles, sorting each one to a suitable array by user ID. I have coded the function to write the profiles, but am having trouble figuring out the read/sort part of it. We were given a very basic example of writing/reading to file with strings in class. Other than that, I've been reading my C book trying to make sense of how to do this. This code is at the very bottom of the code, the read/sort function I started is encased in /*** ... ***/ so the program will run, and the write function is above it.
I thank anyone taking the time to look at this, and greatly appreciate any help!
My second requirement is to store the User profiles to a separate file, and then when the user goes to sign in with a user ID/ password, to open the file and read the profiles, sorting each one to a suitable array by user ID. I have coded the function to write the profiles, but am having trouble figuring out the read/sort part of it. We were given a very basic example of writing/reading to file with strings in class. Other than that, I've been reading my C book trying to make sense of how to do this. This code is at the very bottom of the code, the read/sort function I started is encased in /*** ... ***/ so the program will run, and the write function is above it.
I thank anyone taking the time to look at this, and greatly appreciate any help!
/* Summary: Allows a user to login or create a personal account, allows an admin to login and create multiple user accounts for employees. */ #include <stdio.h> #include <stdlib.h> #define BUFFER 128 #define PASS 16 struct profile { char user[20]; char pass[PASS]; char last[15]; char first[15]; char email[30]; int firsttime; }; //prototypes void mainmenu(struct profile User [], int size, int *ucount); void signup(struct profile User [], int size, int *ucount); void signin(struct profile User [], int size, int *ucount); void adminSignup(struct profile User [], int size, int *ucount); void userSignup(struct profile User [], int size, int *ucount); int populate5(struct profile User []); int credentials(struct profile User [], int size, int *ucount, char userid[], char pass[]); int verifypass(struct profile User [], int *ucount); int verifyuser(struct profile User [], char userid [], int size, int *ucount); int verifyemail(struct profile User [], int *ucount); int admin(struct profile User [], int size, int *ucount, int a); void allsignup(struct profile User [], int size, int *ucount, int k); void adminlogin(struct profile User [], int size, int *ucount); void userfiles(struct profile User [], int *ucount); void readfiles(struct profile User [], int *ucount, int size); void accountwelcome(struct profile User [], int *ucount); //endprotos //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// int main(int argc, char *argv[]) { //declarations int size = 15;//create 15 empty profiles struct profile User[size]; int ucount = 0;//used for keeping track of the number of stored accounts char choice = ' '; do {//beginprog system("CLS"); printf("********** Login Program **********\n"); printf("1 -- Begin\n"); printf("2 -- QUIT\n"); printf("***********************************\n");\ choice = getch(); if(choice == '1') mainmenu(User, size, &ucount); }while(choice != '2'); system("CLS"); return 0; }//endprog //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// void mainmenu(struct profile User [], int size, int *ucount) { //declarations char choice = ' '; int a = 0; do {//main menu system("CLS"); printf("********** Main Menu **********\n"); printf("1 -- Admin Initial Sign Up\n");//admin must create a profile before other options can be accessed printf("2 -- Sign Up\n");//create profile printf("3 -- Sign In\n");//login printf("4 -- QUIT\n"); printf("*******************************\n"); choice = getch(); switch(choice) { case '1' : a = admin(User, size, ucount, a); break; /////////////////////////////////////////// case '2' : if(a == 0) { printf("\nAdmin profile must be created first!\n"); system("PAUSE"); } else signup(User, size, ucount); break; /////////////////////////////////////////// case '3' : signin(User, size, ucount); break; /////////////////////////////////////////// case '4' : exit(1); } }while(choice != '4'); } //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// void signup(struct profile User [], int size, int *ucount) { //declarations char choice = ' '; do {//main menu system("CLS"); printf("********** Sign Up **********\n"); printf("1 -- Admin Creates Profiles\n");//admin creates profiles for users printf("2 -- User Sign Up\n");//user creates personal profile printf("3 -- Back\n"); printf("*****************************\n"); choice = getch(); switch(choice) { case '1' : adminlogin(User, size, ucount); break; case '2' : userSignup(User, size, ucount); break; case '3' : break; } }while(choice != '3'); } //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// void adminSignup(struct profile User [], int size, int *ucount) { //declarations char choice = '\0'; int k = 1; do {//admin authenticated and can create profiles system("CLS"); printf("********** Admin Sign Up **********\n"); printf("There are %d empty profiles remaining\n", (size - *ucount)); printf("1 -- Create New User\n"); printf("2 -- Back\n"); printf("***********************************\n"); choice = getch(); switch(choice) { case '1' : allsignup(User, size, ucount, k); case '2' : break; } }while(choice != '2'); } //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// void userSignup(struct profile User [], int size, int *ucount) { //declarations char choice = ' '; int k = 0; do {//user creates personal profile system("CLS"); printf("********** New User Sign Up **********\n"); printf("1 -- Create New User\n"); printf("2 -- Back\n"); printf("**************************************\n"); choice = getch(); switch(choice) { case '1' : allsignup(User, size, ucount, k); case '2' : break; } }while(choice != '2'); } //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// int credentials(struct profile User [], int size, int *ucount, char userid[], char pass[]) {//verifies input vs stored //declarations int i = 0; int a = 0; int b = 0; do {//checks pointer to array of user input against Stucture arrays if(strcmp(userid, User[i].user) == 0) a = 1;//if all characters match, activate flag -a- if(strcmp(pass, User[i].pass) == 0) b = 1;//if all characters match, activate flag -b- if(a == 1 && b ==1) { printf("\nLogin Successful!\n\n"); system("PAUSE"); return 1;//if flags -a- and -b- match, validation successful } else i++;//otherwise move to next account to check against }while(i<size); return 0; } //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// void signin(struct profile User [], int size, int *ucount) { //declarations int i = 0; int z = 0; char userid[20] = {' '}; char pass[16] = {' '}; int attempt = 3; int success = 1; int len = 0; do {//validate input vs stored system("CLS"); //enter user ID printf("Enter userID >> "); fgets(userid, BUFFER, stdin); while(userid[0] == '\n') { attempt = attempt - 1; printf("\nIncorrect entry, you have %d attempts remaining\n",attempt); system("PAUSE");//decrements # of attempts remaining if just [ENTER] is pressed if(attempt == 0) return; system("CLS"); printf("Enter userID >> "); fgets(userid, BUFFER, stdin); } len = strlen(userid);//removes [ENTER] as a character if(userid[len - 1] == '\n') userid[len-1] = '\0'; //enter user password printf("\nEnter password >> "); fgets(pass, BUFFER, stdin); while(pass[0] == '\n') { attempt = attempt - 1; printf("\nIncorrect entry, you have %d attempts remaining\n",attempt); system("PAUSE");//decrements # of attempts remaining if just [ENTER] is pressed if(attempt == 0) return; system("CLS"); printf("Enter password >> "); fgets(pass, BUFFER, stdin); } len = strlen(pass);//removes [ENTER] as a character if(pass[len - 1] == '\n') pass[len-1] = '\0'; //verify entries success = credentials(User, size, ucount, userid, pass); //decrements # of attempts remaining if incorrect if(success == 0) { attempt = attempt - 1; printf("\nIncorrect entry, you have %d attempts remaining\n",attempt); system("PAUSE"); if(attempt == 0) return;//if no more attempts remaining, return to menu } //if the admin created the user and generated a random password if(User[*ucount].firsttime == 1) { do { printf("This is a new account. Please enter a new password."); printf("\n6 - 15 letters/numbers, cannot begin with a number >> "); fgets(User[*ucount].pass, BUFFER, stdin); //will not accept [ENTER] as the first character entry while(User[*ucount].pass[0] == '\n') { printf("\nEnter User Password"); printf("\n6 - 15 letters/numbers, cannot begin with a number >> "); fgets(User[*ucount].pass, BUFFER, stdin); } len = strlen(User[*ucount].pass); if(User[*ucount].pass[len - 1] == '\n') User[*ucount].pass[len-1] = '\0'; z = verifypass(User, ucount);//send for verification of password }while(z != 4); User[*ucount].firsttime = 0; }//end password creation }while(success == 0); } //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// /* int populate5(struct profile User []) {//hardcoded accounts, including admin strcpy(User[0].first,"Steve"); strcpy(User[0].last,"Haren"); strcpy(User[0].user,"Admin"); strcpy(User[0].pass,"Pwd"); strcpy(User[1].first,"John"); strcpy(User[1].last,"Mathews"); strcpy(User[1].user,"JM561"); strcpy(User[1].pass,"AAA"); strcpy(User[2].first,"Laura"); strcpy(User[2].last,"Candy"); strcpy(User[2].user,"LC968"); strcpy(User[2].pass,"BBB"); strcpy(User[3].first,"Mark"); strcpy(User[3].last,"Johnson"); strcpy(User[3].user,"MJ185"); strcpy(User[3].pass,"CCC"); strcpy(User[4].first,"Mike"); strcpy(User[4].last,"Harrison"); strcpy(User[4].user,"MH115"); strcpy(User[4].pass,"DDD"); return 5; } */ //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// int verifypass(struct profile User [], int *ucount) { //declarations int i = 0; int j = 0; //checks password for length requirements if(strlen(User[*ucount].pass) < 6 || strlen(User[*ucount].pass) > 15) { printf("\nIncorrect entry, password must be between 6 and 15 characters"); return 1; } //checks password for number as first character if(User[*ucount].pass[0] >= 48 && User[*ucount].pass[0] <= 57) { printf("\nIncorrect entry, password cannot start with a number"); return 2; } //checks passsword for mixture of letters and numbers for(i = 0; i < PASS; i++) { if(User[*ucount].pass[i] >= 65 && User[*ucount].pass[i] <= 90 || User[*ucount].pass[i] >= 97 && User[*ucount].pass[i] <= 122) j++; if(strlen(User[*ucount].pass) == j) { printf("\nIncorrect entry, password must contain letters and numbers"); return 3; } } return 4;//returns value if password has met all requirements } //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// int verifyuser(struct profile User [], char userid [], int size, int *ucount) { //declarations int i = 0; while(i<size) { if(strcmp(userid, User[i].user) == 0)//if user entry matches a stored profile { printf("\nThis user ID is already taken."); return 1; } else i++;//else check next profile } return 3; } //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// int verifyemail(struct profile User [], int *ucount) { //declarations int i = 0; int ATcount = 0; int DOTcount = 0; for(i = 0;i < strlen(User[*ucount].email); i++) { //check email for @ symbol if(User[*ucount].email[i] == '@') { ATcount = 1; //ensure '@' is not followed directly by '.' if(User[*ucount].email[i+1] == '.') { printf("\nInvalid email entry 1"); return 1; } } //check email for either .com or .net ending if(User[*ucount].email[i] == '.') { if(User[*ucount].email[i+1] == 'c' && User[*ucount].email[i+2] == 'o' && User[*ucount].email[i+3] == 'm' || User[*ucount].email[i+1] == 'n' && User[*ucount].email[i+2] == 'e' && User[*ucount].email[i+3] == 't') DOTcount = 1; else { printf("\nInvalid email entry, email must end in .com or .net"); return 1; } } //check if '.' found before '@' if(DOTcount > ATcount) { printf("\nInvalid email entry"); return 1; } //if email checks out, return verification if(ATcount == 1 && DOTcount == 1) return 2; } } //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// int admin(struct profile User [], int size, int *ucount, int a) { int k = 0; //prompt user to create Admin account if(a == 0) { system("CLS"); printf("Admin, press any key to create your account.."); getch(); allsignup(User, size, ucount, k); return 1; } //if Admin account already created, deny access to create another and return else { system("CLS"); printf("**** ACCESS DENIED **** ADMIN ACCOUNT ALREADY CREATED!"); getch(); return 1; } } //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// void allsignup(struct profile User [], int size, int *ucount, int k) { //declarations int len = 0; int len1 = 0; int len2 = 0; int len3 = 0; int i = 0; int j = 0; int a = 0; int x = 0; int y = 0; int z = 0; char *idStrCat; char *idU = User[*ucount].user; system("CLS"); //check if all profiles are full and return to menu if so if(*ucount == size) { printf("No more profiles available."); system("PAUSE"); system("CLS"); return; } User[*ucount].firsttime = k;//determines if this is the user's first time //signing up, which will create a random password //enter user first name printf("Enter User First Name >> "); fgets(User[*ucount].first, BUFFER, stdin); //will not accept [ENTER] as the first character entry while(User[*ucount].first[0] == '\n') { printf("Enter User First Name >> "); fgets(User[*ucount].first, BUFFER, stdin); } len = strlen(User[*ucount].first); if(User[*ucount].first[len - 1] == '\n') User[*ucount].first[len-1] = '\0'; len1 = strlen(User[*ucount].first);//set length for first part of userid char *idF = User[*ucount].first; //enter user last name printf("\nEnter User Last Name >> "); fgets(User[*ucount].last, BUFFER, stdin); //will not accept [ENTER] as the first character entry while(User[*ucount].last[0] == '\n') { printf("Enter User Last Name >> "); fgets(User[*ucount].last, BUFFER, stdin); } len = strlen(User[*ucount].last); if(User[*ucount].last[len - 1] == '\n') User[*ucount].last[len-1] = '\0'; char *idL = User[*ucount].last; len2 = strlen(User[*ucount].last);//set length for second part of userid len3 = len1 + len2;//set userid length /******************************************************************************/ idStrCat = strcat(idF, idL);//use pointers to set userid as combo of first and last name idU = idStrCat;//set the User ID to the strcat of first and last name if(len3 < 20) { i = len3; for(i = len3; i < 20; i++) User[*ucount].user[i] = '\0'; } /******************************************************************************/ //if first time account is being created by admin if(User[*ucount].firsttime == 1) { i = 0; srand(time(0));//generate different set of password characters each time while(i < 15) {//execute until 15 characters are stored int randnum = rand()%122;//stores random ASCII number generated if(randnum >= 48 && randnum <= 57 || randnum >= 65 && randnum <= 90 || randnum >= 97 && randnum <= 122) {//if character generated is only either a letter or number User[*ucount].pass[0] = randnum; i++; }//endif }//endwhile for password storage }//end password creation else { do { printf("\nEnter User Password"); printf("\n6 - 15 letters/numbers, cannot begin with a number >> "); fgets(User[*ucount].pass, BUFFER, stdin); //will not accept [ENTER] as the first character entry while(User[*ucount].pass[0] == '\n') { printf("\nEnter User Password"); printf("\n6 - 15 letters/numbers, cannot begin with a number >> "); fgets(User[*ucount].pass, BUFFER, stdin); } len = strlen(User[*ucount].pass); if(User[*ucount].pass[len - 1] == '\n') User[*ucount].pass[len-1] = '\0'; z = verifypass(User, ucount);//send for verification of password }while(z != 4); } //enter user email do { printf("\nEnter User Email >> "); fgets(User[*ucount].email, BUFFER, stdin); len = strlen(User[*ucount].email); if(User[*ucount].email[len - 1] == '\n') User[*ucount].email[len-1] = '\0'; x = verifyemail(User, ucount);//send for verification of email }while(x != 2); //requirements accountwelcome(User, ucount); userfiles(User, ucount); //move to next empty profile *ucount = *ucount + 1; return;//exit to menu } //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// void adminlogin(struct profile User [], int size, int *ucount) { //declarations int a = 0; int b = 0; int i = 0; char userid[10] = {' '}; char pass[16] = {' '}; int attempt = 3; int success = 0; int len = 0; do { system("CLS"); printf("Enter Admin userID >> "); fgets(userid, BUFFER, stdin);//enter admin username while(userid[0] == '\n') {//wrong entry, X tries remaining out of 3 attempt = attempt - 1; printf("\nIncorrect entry, you have %d attempts remaining\n",attempt); system("PAUSE"); if(attempt == 0) return; system("CLS"); printf("Enter Admin userID >> "); fgets(userid, BUFFER, stdin); } len = strlen(userid);//removes '\n' from string to match against hardcoded entries if(userid[len - 1] == '\n') userid[len-1] = '\0'; printf("\nEnter Admin password >> "); fgets(pass, BUFFER, stdin);//enter admin password while(pass[0] == '\n') {//wrong entry, X tries remaining out of 3 attempt = attempt - 1; printf("\nIncorrect entry, you have %d attempts remaining\n",attempt); system("PAUSE"); if(attempt == 0) return; system("CLS"); printf("Enter Admin password >> "); fgets(pass, BUFFER, stdin); } len = strlen(pass);//removes '\n' from string to match against hardcoded entries if(pass[len - 1] == '\n') pass[len-1] = '\0'; if(strcmp(userid, User[0].user) == 0) a = 1;//if all characters match, activate flag -a- if(strcmp(pass, User[0].pass) == 0) b = 1;//if all characters match, activate flag -b- if(a == 1 && b == 1) { printf("\nLogin Successful!\n\n"); system("PAUSE"); success = 1;//if flags -a- and -b- match, validation successful } else {//if entries are not correct attempt = attempt - 1; printf("\nIncorrect entry, you have %d attempts remaining\n",attempt); system("PAUSE"); if(attempt == 0) return; } }while(success == 0); if(success == 1) adminSignup(User, size, ucount);//grant access to create profiles } //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// void userfiles(struct profile User [], int *ucount) { //declarations FILE *fprofiles; struct profile *puser = &User[*ucount]; if((fprofiles = fopen("Profiles", "a+")) == NULL) { printf("Cannot open file! ...any key to continue\n"); getch(); exit(1); } //create file and write current user profile to it fwrite(puser, sizeof(struct profile), 1, fprofiles); if(fclose(fprofiles) == EOF); printf("\nFile couldn't be closed!!\n"); return;//close file and return } //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// /* void readfiles(struct profile User [], int *ucount, int size) { //declarations int i = 0; struct *puser = &User; if((fprofiles = fopen("Profiles", "r")) == NULL) { printf("\nFile couldn't be opened!\n"); exit(1); } //read all structures stored for(i = 0;i < size;i++) { fread(*(puser+i), sizeof(*puser), 1, fprofiles); fclose(fp); return; } */ //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// void accountwelcome(struct profile User [], int *ucount) { printf("\nNew account created!"); printf("\n\nYour User ID is >> %s", User[*ucount].user); printf("\nYour Password is >> %s", User[*ucount].pass); getch(); return; }