gjscjfdll   4년 전

안녕하세요, 코드 구조상 문제가 없어보여 질문남깁니다.

while문에서 fgets을 사용하여 개행문자까지 반복해서 읽어들이는 코드를 작성했습니다.

fgets 함수는 개행문자까지 포함하여 읽어들이는 것으로 알고 있기때문에 0~(문자열의 길이-2)까지 for문을 활용하여 문자 검사를 수행했습니다.

for문 수행시, 만일 문자가 '('이나 '['같이 여는 문자일 경우 스택에 삽입했습니다.  ')' ']'와 같은 닫는 문자열일 경우 스택의 top에 있는 문자와 비교하여 같은 종류의 문자일 경우 pop하고 같지 않으면 flag의 값을 1로 변경하여 균형이 맞지 않음을 표시했습니다.

그리고 전체 문자열을 모두 확인한 후 스택이 비어있지 않을 경우 균형이 맞지 않은 문자열이므로 flag 값을 1로 변경했습니다.

따라서 최종적으로 flag==1일 경우 "no"를 출력 / flag==0일경우 "yes"출력하도록 코드를 작성했습니다.

구조상 문제가 없다고 생각하는데 제가 놓친 부분이 있는걸까요? 답변 부탁드리겠습니다.

djm03178   4년 전

fgets에 100글자가 포함된 한 줄을 온전하게 담으려면 최소 102칸이 필요하고, 두 번째 인자로 넘겨주는 값도 최소 102여야 합니다.

100글자가 한 줄에 들어왔다면, 99번째 인덱스까지는 문자들이 있고, 그 다음에 개행 문자, 그 뒤에 널 문자까지 해서 101번째 인덱스까지 사용해야하기 때문에 102칸이 필요합니다.

101칸만 사용하려고 하면 개행 문자를 포함할 공간이 부족하기 때문에 fgets 함수가 개행 문자를 아예 읽지 않고 그 전까지만 배열에 넣어줍니다. 즉, 그 개행 문자는 다음 번 루프를 돌 때 fgets가 읽게 되므로 한 줄이 더 있는 것처럼 동작하게 될 뿐 아니라 30번째 줄에서 length-1개의 문자를 보는 것 역시 잘못된 동작을 하게 됩니다.

gjscjfdll   4년 전

친절한 답변 감사드립니다. ㅎㅎ 

덕분에 다음에는 같은 실수를 하지 않겠네요, 감사합니다.

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