c언어 질문드립니다.

cooki2535의 이미지

문제 해결하였습니다 감사합니다.

세벌의 이미지

Show your error message

raymundo의 이미지

" 계속해서 같은 곳에, 비슷한 문제가 발생합니다. "
이렇게 쓰지 마시고,

입력을 어떻게 주면 어떤 결과가 나와야 하는데 실제로는 어떤 결과가 나온다고 구체적으로 적어주세요.

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 배열의 각 원소를 출력하는 함수를 따로 만들어두고 그걸 보면서 테스트하겠습니다. (아니면 그냥 사용하시는 툴의 디버깅 기능을 써도 되겠습니다만)

좋은 하루 되세요!

cooki2535의 이미지

조언 너무 감사합니다!!

shint의 이미지

#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);
}
댓글 첨부 파일: 
첨부파일 크기
Package icon ConsoleApplication1.zip7.98 KB

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

익명 사용자의 이미지

도움을 주셔서 너무 감사합니다. 감사인사가 너무 늦어서 죄송합니다! 도움 많이 되었습니다!! 좋은 하루 되세요!

tyhan의 이미지

도움을 잘 받으셨다니 다행이네요.

답을 받은 후 문제를 지워버리면 같은 문제로 고민하는 다른 분이 찾아 볼수가 없습니다.
크게 문제가 되지 않는다면 다음부터는 질문의 내용을 남겨두시면 감사하겠습니다.

글쓴이의 이미지

아! 네 죄송합니다! 다음부터 참고하겠습니다!1

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.