입력을 어떻게 주면 어떤 결과가 나와야 하는데 실제로는 어떤 결과가 나온다고 구체적으로 적어주세요.
P.S.
그리고 코드를 눈으로만 훑어봐도 이상한 게 한두 가지가 아니네요. New_acc 를 비롯한 여러 함수들의 정의가 왜 main()함수의 안쪽에 들어가 있고, 또 중간중간 quit()을 호출하려는 걸로 보이는 코드 같은데 앞에 void 키워드가 같이 붙어 있고요.
bankptr 은 typedef으로 정의한 타입의 이름이지 변수의 이름이 아닌데, 어째서 switch case 문에서는 put(bankptr.acc_num, ... )처럼 마치 bankptr이라는 이름의 변수가 있는 것처럼 사용하고 있나요?
bankptr 타입을 정의하기도 전에 이미 여러 함수의 프로토타입을 선언하는 곳에서 파라메터 리스트에 bankptr을 쓰고 있네요.
BANK = &BANK; 이 코드는 도대체 무엇을, 왜 하려는 걸까요?
실행 결과에 버그가 있는 게 아니라 애초에 컴파일이 안 된다는 얘기였을 텐데, 조언을 드리자면 필요한 기능을 다 만들어놓은 후 그제서야 컴파일하고 실행하고 버그를 잡으려고 하지 마세요. 기능 한 개를 테스트하는데 10의 노력이 필요하다면, 기능 다섯 개를 일단 만들고 그 다음에 테스트하려면 50이 아니라 좀 과장하면 500의 노력이 필요합니다. 지금 같은 경우는 컴파일 에러도 수십 개가 나왔을 텐데 그러면 어디서부터 손을 봐야 할지 엄두도 안 나겠네요.
main 함수와 계좌 추가 기능만 딱 만들고 끝내세요. 물론 계좌 추가가 제대로 되었는지를 확인할 방법은 있어야 될 텐데, _balance나 checkAccount 까지 추가로 만들 수도 있겠지만 저라면 그냥 printf 잔뜩 때려박아서 acc_num 배열의 각 원소를 출력하는 함수를 따로 만들어두고 그걸 보면서 테스트하겠습니다. (아니면 그냥 사용하시는 툴의 디버깅 기능을 써도 되겠습니다만)
Show your error message
Show your error message
세벌 https://sebuls.blogspot.kr/
" 계속해서 같은 곳에, 비슷한 문제가 발생합니다.
" 계속해서 같은 곳에, 비슷한 문제가 발생합니다. "
이렇게 쓰지 마시고,
입력을 어떻게 주면 어떤 결과가 나와야 하는데 실제로는 어떤 결과가 나온다고 구체적으로 적어주세요.
P.S.
그리고 코드를 눈으로만 훑어봐도 이상한 게 한두 가지가 아니네요. New_acc 를 비롯한 여러 함수들의 정의가 왜 main()함수의 안쪽에 들어가 있고, 또 중간중간 quit()을 호출하려는 걸로 보이는 코드 같은데 앞에 void 키워드가 같이 붙어 있고요.
bankptr 은 typedef으로 정의한 타입의 이름이지 변수의 이름이 아닌데, 어째서 switch case 문에서는 put(bankptr.acc_num, ... )처럼 마치 bankptr이라는 이름의 변수가 있는 것처럼 사용하고 있나요?
bankptr 타입을 정의하기도 전에 이미 여러 함수의 프로토타입을 선언하는 곳에서 파라메터 리스트에 bankptr을 쓰고 있네요.
BANK = &BANK; 이 코드는 도대체 무엇을, 왜 하려는 걸까요?
실행 결과에 버그가 있는 게 아니라 애초에 컴파일이 안 된다는 얘기였을 텐데, 조언을 드리자면 필요한 기능을 다 만들어놓은 후 그제서야 컴파일하고 실행하고 버그를 잡으려고 하지 마세요. 기능 한 개를 테스트하는데 10의 노력이 필요하다면, 기능 다섯 개를 일단 만들고 그 다음에 테스트하려면 50이 아니라 좀 과장하면 500의 노력이 필요합니다. 지금 같은 경우는 컴파일 에러도 수십 개가 나왔을 텐데 그러면 어디서부터 손을 봐야 할지 엄두도 안 나겠네요.
main 함수와 계좌 추가 기능만 딱 만들고 끝내세요. 물론 계좌 추가가 제대로 되었는지를 확인할 방법은 있어야 될 텐데, _balance나 checkAccount 까지 추가로 만들 수도 있겠지만 저라면 그냥 printf 잔뜩 때려박아서 acc_num 배열의 각 원소를 출력하는 함수를 따로 만들어두고 그걸 보면서 테스트하겠습니다. (아니면 그냥 사용하시는 툴의 디버깅 기능을 써도 되겠습니다만)
좋은 하루 되세요!
조언 너무 감사합니다!!
조언 너무 감사합니다!!
참고해보세요.
#include < stdio.h > //< 동적할당을 위한 헤더 #include < stdlib.h > //< strcmp를 위한 헤더 #include < string.h > #define DF_AccountNumber 5 // 가능한 계좌(한정시키기) int number = 0; // 계좌번호세기(count용) typedef struct BANK // 고객정보 구조체선언 { char name[10]; // 계좌명 char acc_num[8]; // 계좌 번호 int cash; } *bankprt; void New_acc(bankprt* acc_num, int* number); //계좌 신설 void put(bankprt* acc_num, int number);// 입금 void out(bankprt* acc_num, int number);// 출금 void _transfer(bankprt* acc_num, int number); //계좌 이체 void _balance(bankprt* acc_num, int number);// 잔액조회 void quit(); // 종료 void inputAcc_Num(char*acc_num); // 계좌 번호 입력 void _delete(bankprt* acc_num, int number);// 계좌 해제 void checkAccount(bankprt* acc_num, int number);// 모든 계좌 확인 int AccountNumber = 0; //현재 계좌 수 int main() { // bankprt BANK; // BANK = &BANK; bankprt acc_num[5] = { 0 };// 5개 까지 설립 가능 bankprt account;// = { "dmkim", "123-456", 5000 }; //미리 메모리에 생성 하였습니다. //동적으로 생성하고 싶은 경우. 이미 만들어진 코드'를 참고하시기 바랍니다. (이중 연결 리스트 등등) int size_bank = sizeof(BANK); int i = 0; for (i = 0; i < 5; i++) { acc_num[i] = (bankprt)malloc(size_bank); memset(acc_num[i], 0x00, size_bank); // strcpy(acc_num[i]->name, "[EMPTY]"); //삭제된 경우를 생성할때. 확인하기 위해 이름을 넣어줍니다. } // account = (bankprt) malloc(size_bank); strcpy(account->name, "dmkim"); strcpy(account->acc_num, "123-456"); account->cash = 5000; int input_menu = 0; // 메뉴 받을 변수 while (1) { printf("\n"); printf("\t\t 입력가능 계좌 번호 수 : %d개 \n", AccountNumber); printf("\t\t 현재 계좌 번호 : %d개 \n", number); printf("\n"); printf("\t\t ========= M E N U ========= \n"); printf("\n"); printf("\t\t 1 계좌신설 2 입 금 \n"); printf("\t\t 3 출 금 4 계좌 이체 \n"); printf("\t\t 5 잔액 조회 6 계좌 해약 \n"); printf("\t\t 7 모든 계좌 정보 출력 8 종 료 ☞ 메뉴입력 : "); printf("\n"); scanf("%d", &input_menu); switch (input_menu) { case 1: { //계좌 만들기 New_acc(acc_num, &AccountNumber); } break; case 2: { //입금 put(acc_num, AccountNumber); } break; case 3: { //출금 out(acc_num, AccountNumber); } break; case 4: { //계좌 이체 _transfer(acc_num, AccountNumber); } break; case 5: { //잔액조회 _balance(acc_num, AccountNumber); } break; case 6: { //계좌 해제 _delete(acc_num, AccountNumber); } break; case 7: { // 모든 계좌 확인 checkAccount(acc_num, AccountNumber); } break; case 8: //quit { // 모든 계좌 확인 quit(); } break; } } return 0; } //계좌 신설 void New_acc(bankprt* acc_num, int* number) { char accountTemp[8] = " "; int i = 0; int size_bank = sizeof(BANK); int num = *number; int if_empty = 0; if (num >= 5) { printf("생성 가능한 계좌 갯수를 초과했습니다. : \n"); return; } // printf("계좌 번호를 입력해 주세요 : "); scanf("%s", accountTemp); for (i = 0; i < num; i++) { //삭제된 계정 공간이 있다면. 계좌 생성 if (strcmp(acc_num[i]->name, "[EMPTY]") == 0) { if_empty = 1; break; } if (strcmp(accountTemp, (*acc_num)[i].acc_num) == 0) { printf("같은 계좌 번호가 존재합니다.\n"); return; } } // bankprt bp = acc_num[i]; // printf("계좌 이름을 입력해 주세요 : "); scanf("%s", bp->name); // strcpy(bp->acc_num, accountTemp); bp->cash = 0; //계정이 삭제 안된 경우. if (if_empty == 0) { num++; } *number = num; printf("[생성된 계좌의 포인터 주소 %d] [갯수 %d]\n", bp, num); printf("계좌가 생성되었습니다.\n"); } void inputAcc_Num(char* acc_num) // 계좌 번호 입력 { printf("계좌 번호를 입력해주세요: \n"); scanf("%s", acc_num); } void put(bankprt* acc_num, int number)// 입금 { char in_acc_num[8]; int i = 0; int cash = 0; int use = 0; //계좌 번호 입력 inputAcc_Num(in_acc_num); // for (i = 0; i < number; i++) { if (strcmp(in_acc_num, acc_num[i]->acc_num) == 0) { printf("입력하신 계좌를 찾았습니다.\n"); use = 1; break; } } if (use == 0) { printf("해당 계좌를 찾을 수 없습니다.\n"); return; } //입금할 돈을 입력 printf("입금할 돈을 입력해주세요 : "); scanf_s("%d", &cash); acc_num[i]->cash += cash; return; } void out(bankprt* acc_num, int number)// 출금 { char in_acc_num[8]; int i = 0; int cash = 0; int use = 0; //계좌 번호 입력 inputAcc_Num(in_acc_num); // //< 반복문을 돌며 strcmp로 계좌번호 검사. for (i = 0; i < number; i++) { if (strcmp(in_acc_num, acc_num[i]->acc_num) == 0) { printf("입력하신 계좌를 찾았습니다.\n"); use = 1; break; } } //< 만약 반복문을 돌아도 찾지 못했다면 if (use == 0) { //< 에러 검출 후 탈출 printf("해당 계좌를 찾을 수 없습니다.\n"); return; } //< 아니라면 찾을 돈을 입력. printf("출금할 돈을 입력해주세요 : "); scanf("%d", &cash); //< 출금할 돈이 더 많다면 if (acc_num[i]->cash < cash) { //< 에러 검출 후 탈출 printf("계좌에 금액이 부족합니다.\n"); printf("현재 금액 : %d\n", acc_num[i]->cash); return; } //< 그게 아니라면 돈 출금 else { acc_num[i]->cash -= cash; } } void _transfer(bankprt* acc_num, int number) //계좌 이체 { int i = 0; int i2 = 0; char toAcc[8]; char in_acc_num[8]; int use1 = 0; int use2 = 0; int cash = 0; // printf("보낼 계좌 번호를 입력하십시오: \n"); scanf("%s", in_acc_num); // for (i = 0; i < number; i++) { if (strcmp(in_acc_num, acc_num[i]->acc_num) == 0) { printf("입력하신 계좌를 찾았습니다.\n"); use1 = 1; break; } } // if (use1 == 0) { printf("해당 계좌를 찾을 수 없습니다.\n"); return; } printf("금액 : \n"); scanf("%d", &cash); printf("받는 계좌 번호를 입력하십시오 : \n"); scanf("%s", &toAcc); // for (i2 = 0; i2 < number; i2++) { if (strcmp(toAcc, acc_num[i2]->acc_num) == 0) { printf("입력하신 계좌를 찾았습니다.\n"); use2 = 1; break; } } // if (use2 == 0) { printf("해당 계좌를 찾을 수 없습니다.\n"); return; } // if (acc_num[i]->cash < cash) { printf("계좌에 금액이 부족합니다.\n"); printf("현재 금액 : %d\n", acc_num[i]->cash); return; } //< 그게 아니라면 돈 출금 else { acc_num[i]->cash -= cash; acc_num[i2]->cash += cash; printf("송금 되었습니다.\n" ); } } void _balance(bankprt* acc_num, int number)// 잔액조회 { char in_acc_num[8]; int i = 0; int use = 0; //계좌 번호 입력 inputAcc_Num(in_acc_num); // for (i = 0; i < number; i++) { if (strcmp(in_acc_num, acc_num[i]->acc_num) == 0) { printf("입력하신 계좌를 찾았습니다.\n"); use = 1; break; } } if (use == 0) { printf("해당 계좌번호가 존재하지 않습니다.\n"); return ; } printf("%s 계좌의 계좌번호는 %s 입니다.\n", acc_num[i]->name, acc_num[i]->acc_num); printf("%s 계좌의 현재 잔액은 %d원 입니다.\n", acc_num[i]->name, acc_num[i]->cash); } void _delete(bankprt* acc_num, int number)// 계좌 해제 { int count, i, j = 0; int use = 0; char in_acc_num[8]; // printf("계좌 번호를 입력하십시오 : \n"); scanf("%s", in_acc_num); // for (i = 0; i < number; i++) { if (strcmp(in_acc_num, acc_num[i]->acc_num) == 0) { printf("입력하신 계좌를 찾았습니다.\n"); use = 1; break; } } if (use == 0) { printf("해당 계좌번호가 존재하지 않습니다.\n"); return; } //계좌를 초기화 합니다. int size_bank = sizeof(BANK); memset(acc_num[i], 0x00, size_bank); //다시 생성할때 확인하기 위해서. 계정 이름에 [EMPTY] 이름을 넣어줍니다. strcpy(acc_num[i]->name, "[EMPTY]"); } //모든 계정 정보를 출력한다 void checkAccount(bankprt* acc_num, int number) { int count, i, j = 0; // for (i = 0; i < number; i++) { printf("이름. %10s /t", acc_num[i]->name); printf("계좌. %10s /t", acc_num[i]->acc_num); printf("금액. %d\n", acc_num[i]->cash); } } void quit() // 종료메시지 함수 { printf("\n"); printf("\t\t 이용해주셔서 대단히 감사합니다 \n"); printf("\n\n"); exit(0); }----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
도움을 주셔서 너무 감사합니다. 감사인사가 너무
도움을 주셔서 너무 감사합니다. 감사인사가 너무 늦어서 죄송합니다! 도움 많이 되었습니다!! 좋은 하루 되세요!
도움을 잘 받으셨다니 다행이네요.
도움을 잘 받으셨다니 다행이네요.
답을 받은 후 문제를 지워버리면 같은 문제로 고민하는 다른 분이 찾아 볼수가 없습니다.
크게 문제가 되지 않는다면 다음부터는 질문의 내용을 남겨두시면 감사하겠습니다.
아!
아! 네 죄송합니다! 다음부터 참고하겠습니다!1
댓글 달기