도움 부탁드립니다. 간단한 소스인데 제가 잘 몰라서요 C언어 입니다.
글쓴이: 궁금파워 / 작성시간: 월, 2018/07/23 - 11:56오전
#include <stdio.h> void main(){ char fname[]="visual_studio_practice.txt"; char faname[]="file_practice.txt"; FILE *f; FILE *fa; char Order [2][12]; int i=1; int j=1; int n=1; while(fopen_s(&f, fname, "r")==0){ fscanf_s(f, "%s %d %s %d %s %d %s %d\n", Order[i,j], Order[i,j+1], Order[i,j+2], Order[i, j+3], Order[i, j+4], Order[i, j+5], Order[i,j+6], Order[i,j+7]); i++; j=j+8; //printf("i: %d", i); } for (n=1; n<=2; n++){ i=1; j=1; while(fopen_s(&fa, faname, "w")==0){ fprintf_s(fa, "%s %d %s %d %s %d %s %d\n", Order[i,j], Order[i,j+1], Order[i,j+2], Order[i, j+3], Order[i, j+4], Order[i, j+5], Order[i,j+6], Order[i,j+7]); j=j+8; i++; } } }
그리고 visual_studio_practice.txt에 담겨 있는 것은 다음과 같습니다.
ollist 3 5 7 9 24 38 29
permant 4 7 3 9 23 23 12
제 목적은 이것을 읽어들여서 다시 파일에 출력하는 것 입니다. Order란 배열에 넣었습니다. 근데 Order는 char인데 int형도 제대로 취급하나요.
실행 시켜보면 510번이나 돌아갑니다. 그리고 출력 파일도 생성되지 않습니다.
도움 부탁드립니다.
Forums:
1. while(fopen_s(&f, fname,
1.
while(fopen_s(&f, fname, "r")==0)
는 무슨 의도로 사용한 건가요?루프 안에서 파일을 닫지도 않고, 달리 루프를 빠져나갈 방법도 없기 때문에 이 루프는 그야말로 "실패할 때까지" 파일을 계속 새로 열어댑니다. 그걸 의도하신 건 아닌 것 같은데요.
2.
scanf류 함수들은 굉장히 유연하고 쓰기 편리하지만 잘못 사용하기도 너무 쉬워서 주의가 많이 필요합니다.
일단 comma를 사용한 2차원 배열 Order 인덱싱은 전부 잘못되었습니다. 대체로 수학이 익숙하고 C언어 경험이 적은 분들이 (a < b < c 꼴의 부등식 조건식과 더불어) 많이 실수하시는 부분인데 C언어에서는 N_i,j꼴로 인덱싱을 할 수 없습니다. 여기서의 ,는 Comma operator이기 때문이죠. 이게 또 유효한 C 문법인데 의도대로 돌지 않는 경우이기 때문에 사용자가 주의하는 수밖에 없어요.
https://en.wikipedia.org/wiki/Comma_operator
Order[i,j]를 Order[i][j]로 고친다고 해도 문제가 남습니다. 이건 주소가 아니기 때문에 &Order[i][j]와 같이 주소를 취해야 합니다.
그리고 그렇게 바꾸더라도 여전히 format specifier하고 일치하지 않네요. %s와 %d를 번갈아 쓰고 계신데 각각이 무엇을 의미하고 어떻게 동작하는지 이해하고 쓰신 건가요? 지금 코드는 구현하고자 하는 목적과 상당히 거리가 있어 보입니다.
3. 루프에 달리 종료 조건이 있지도 않은데 i와 j는 매 반복마다 증가하기 때문에 fscanf_s는 결국 배열을 벗어나서 쓰게 됩니다.
부주의하게 짜인 C언어 프로그램의 고질병인 buffer overflow가 발생하는 것인데, 이 경우는 루프가 정상적으로는 절대 종료하지 않기 때문에 결국 스택을 벗어나서 유효하지 않은 메모리 주소에 도달하게 됩니다. 그래서 프로그램이 죽는거죠.
그밖에 문제가 더 있을 수도 있지만 일단 이 정도면 충분해 보이는군요. 소스코드를 그저 컴파일만 되도록 작성하는 게 아니라, 각 소스코드 라인이 어떤 의미를 가지는지 충분히 숙고하고 작성해야 의도대로 동작하는 올바른 프로그램을 만들 수 있을 것입니다.
초보라서 그럽니다. 좀 도와 주세요
제가 잘못 올렸는데
visual_studio_practice.txt엔
위의 글이 아니라
첨부한 파일이 들어있습니다.
댓글 달기