inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

C 프로그래밍 - 입문부터 게임 개발까지

프로젝트(후반전)

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

263

yokxim

작성한 질문수 7

0

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

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

while (1)

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

getchar();

}

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

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

c

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

(실행결과화면)

감사합니다.

안녕하세요 7장 포인터에 관해 질문드립니다.

0

63

1

8-8 연장전 / 소스코드 공유해드려요. 참고하세요!

0

64

0

섹션6. 프로젝트 소스코드 올려드려요.

0

94

1

영상속에서 배운 코드들을 Git Repository에 올려두될까요?

0

79

1

경찰서 조서 프로젝트 문의

0

104

1

경찰관 조서 프로젝트

0

142

1

scanf

0

92

1

제대로 작성한것 같은데 빌드가 않됩니다.,

0

170

1

구문 오류 C2059

0

400

1

컴파일 시 fatal error C1010 발생

0

284

1

반환값이 없는 함수

0

215

1

반올림 되는건가요?

0

253

1

맥으로수강

0

193

1

10-2

0

257

1

질문이 있습니다

0

342

1

3-3 for 반복문 ++i 일때 질문입니다.

0

244

1

6-4(배열 파트 '문자 vs 문자열') sizeof 예제 다르게 출력되는 분들 참고하세요.

1

411

0

함수 선언과 정의를 동시에 해도 되나요?

0

1076

1

빌드오류가 있다고 나오고, 지정된 파일을 찾을 수 없다고 오류가 나옵니다..

0

403

1

안녕하세요 좋은 강의와 책 감사드립니다!! 다름이 아니라 명령어를 실행시켰을 때 저런식으로 나와서 질문드립니다

0

934

0

질문있습니다!

0

378

1

질문드립니다

0

387

1

scanf_s(" %d", &answer); 이후 바로 종료

0

312

0

질문 드립니다.

0

431

1