potocanon1234   2년 전

27줄에서 버퍼 오버런이 발생했다고 뜹니다. 예제를 돌리면 예제의 출력과 동일한 문자열과 쓰레기값이 출력됩니다.

이유를 모르겠습니다;; 지적부탁드립니다!

wjdgud0621   2년 전

0. 19번줄의 함수는 숫자 뒤에 있는 입력을 무시해버리게 되므로 삭제해야 합니다.

1. S의 배열 길이가 부족합니다. fgets는 문자열을 입력받은 후 뒤에 \n와 \0을 함께 저장하는데 이를 위해 23개의 공간이 필요합니다.

2. cnt가 초기화되지 않고 있습니다. 각 테스트 케이스가 시작될때 cnt를 0으로 초기화해야 합니다.

3. P에는 맨 앞에 공백과, 맨 뒤에 줄바꿈이 포함되어 있습니다. for(j=1; j<strlen(S)-1; j++)로 하여 두 문자를 무시해야 합니다.

4. P에 문자열을 담은 후 \0이 채워지고 있지 않습니다. 출력을 하기 전, P[cnt]에 \n을, P[cnt+1]에 \0을 저장할 필요가 있습니다.

potocanon1234   2년 전

정성글 감사합니다! 

Q1. 그런데 0.에서 19번째 줄 함수는 뒤에 입력을 무시하게  된다 하셨는데 저 함수를 없애면 fgets함수가 scanf_s()가 사용한 입력버퍼에 남아있는 \n을 읽고 \n에\0을 더해서 문자열로 저장하게 되지 않나요?

Q2. S의 배열의 길이가 부족하다고 하셨는데 fgets()가 버퍼에 있는 \n까지 문자열에 저장후 \0도 추가하니 22개의 공간이 필요한거 아닌가요?

Q3,4. 저는 P를 일부로 초기화하지 않고 cnt를 증가시켜 R단위 마다 P에 동일값을 저장시키려 했는데 방법이 잘못된건 가요?

Q5. P에 문자배열에 문자를 1개씩 넣고 있으니 마지막P[cnt]에 \0만 넣으면 되지않나요?  

wjdgud0621   2년 전

A1. 15번줄에서 입력을 받고 남은 \n는, 18번줄에서 자동으로 사라지게 됩니다. 또한 정수 입력 후 \n까지 버퍼를 비우면 안 되는 이유는 숫자와 문자가 한 줄에 있기 때문입니다.

A2. 18번줄에서 정수를 입력받은 후에도 맨 앞에 공백문자가 들어있게 됩니다. 문자열 길이가 최대 20이므로, fgets는 \n를 포함하지 않는다고 가정했을때 최대 21개의 문자를 받습니다.

A3.4. fputs는 P의 0번째 인덱스부터 출력하기 때문에, 테스트케이스가 바뀌면 다시 0번째부터 채워줘야 합니다. cnt=0은 20번줄 밑에 필요합니다.

A5. 각 테스트 케이스가 출력하는 문자열은 꼭 \n으로 구분되어야 합니다. 반복을 strlen(S)-1까지 돌림으로써 P에는 \n이 들어있지 않기 때문에 한번 더 추가해 줄 필요가 있습니다.

potocanon1234   2년 전

이해가 안되서 재질문 했었는데 정수와 문자열을 공백을 기준으로 동시에 입력하라는 조건이 있었네요;; 덕분에 해결했습니다 감사합니다!

댓글을 작성하려면 로그인해야 합니다.