• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

일기장을 작성할 때 Enter를 계속 눌러보았습니다.

20.03.28 06:04 작성 조회수 168

0

일기장 내부에서 줄바꿈을 하고 싶을 때도 있지 않습니까? 그래서 '내용을 계속 작성하세요! 종료하시려면 EXIT를 입력하세요!'가 나오고 Enter만 4번 눌렀더니 

이렇게 저장이 되었습니다.

while (1)

{ scanf("%[^\n]), contents);

getchar();

}

제가 생각하기로는 위에 이 코드 때문인것 같습니다. 제가 일기 내용을 작성하고 Enter를 눌러야 이제 scanf(...)에 그 내용이 들어가고 Enter가 getchar()에 들어가서 정상적인 코드가 작성이 되겠지만 아무것도 누르지 않았기에 scanf(...)에 아무것도 저장이 되지 않아서 이상한 문자들이 저장이 된것 같습니다.

이렇게 되지 않게 하기 위해서, 일기장 내부에도 줄바꿈을 사용할수 있게 하기 위해서는 어떤 코드를 작성해야 하는지 질문드립니다...

답변 1

답변을 작성해보세요.

0

안녕하세요

제 강의 코드 기준으로는 엔터만 쳤을 때는 이전에 입력된 값이 찍히는 문제가 있네요

수정된 버전을 드리니 이 파일로 한번 해보시겠어요?

파일 경로만 질문자분의 PC 에 맞춰서 수정하시면 되고,

코드 하단에 있는 memset 부분을 봐주세요.

강의에서 다루지는 않았지만 contents 배열을 초기화 해주는 역할을 한답니다.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

// 비밀번호를 입력 받아서
// 맞는 경우? 비밀 일기를 읽어와서 보여주고, 계속 작성하도록 합니다.
// 틀린 경우? 경고 메시지를 표시하고 종료합니다.

#define MAX 10000

int main(void)
{
	// fgets, fputs 활용
	char line[MAX]; // 파일에서 불러온 내용을 저장할 변수
	char contents[MAX]; // 일기장에 입력할 내용
	char password[20]; // 비밀번호 입력
	char c; // 비밀번호 입력 할 때 키값 확인용 (마스킹)

	printf("'비밀일기'에 오신 것을 환영합니다\n");
	printf("비밀번호를 입력하세요 : ");

	// getchar() / getch() 의 차이?
	// getchar() : 엔터를 입력받아야 동작을 합니다.
	// getch() : 키 입력 시 바로바로 동작을 합니다.

	int i = 0;
	while (1)
	{
		c = getch();
		if (c == 13) // Enter ->  비밀번호 입력 종료
		{
			password[i] = '\0';
			break;
		}
		else // 비밀번호 입력 중
		{
			printf("*");
			password[i] = c;
		}
		i++;
	}

	// 비밀번호 : 나도코딩 skehzheld
	printf("\n\n === 비밀번호 확인 중... ===\n\n");
	if (strcmp(password, "skehzheld") == 0) // 비밀번호 일치
	{
		printf(" === 비밀번호 확인 완료 === \n\n");
		char* fileName = "C:\\secretdiary.txt";
		FILE* file = fopen(fileName, "a+b");
		// 파일이 없으면 생성, 파일이 있으면 append 를 한다 (뒤에서부터 내용을 추가한다)
		if (file == NULL)
		{
			printf("파일 열기 실패\n");
			return 1;
		}

		while (fgets(line, MAX, file) != NULL)
		{
			printf("%s", line);
		}

		printf("\n\n 내용을 계속 작성하세요 ! 종료하시려면 EXIT 를 입력하세요\n\n");

		while (1)
		{
			scanf("%[^\n]", contents); // 새 줄(\n)이 나오기 전까지 읽어들임 (한 문장씩)
			getchar(); // Enter 입력 (\n)  Flush 처리

			if (strcmp(contents, "EXIT") == 0)
			{
				printf("비밀일기 입력을 종료합니다\n\n");
				break;
			}
			fputs(contents, file);
			fputs("\n", file); // Enter 를 위에서 무시 처리 하였으므로 임의로 추가
			memset(&contents[0], 0, sizeof(contents)); // 배열 초기화
		}
		fclose(file);
	}
	else // 비밀번호 틀린 경우
	{
		printf(" === 비밀번호가 틀렸어요 ===\n\n");
		printf(" 꺅!! 당신 누구야?!! 감히 내 일기장을 !!!\n\n\n");
	}

	return 0;
}

(실행결과화면)

감사합니다.