도움 부탁드립니다. 간단한 소스인데 제가 잘 몰라서요 C언어 입니다.

궁금파워의 이미지

#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번이나 돌아갑니다. 그리고 출력 파일도 생성되지 않습니다.

도움 부탁드립니다.

첩첩산중의 이미지

1. while(fopen_s(&f, fname, "r")==0)는 무슨 의도로 사용한 건가요?

루프 안에서 파일을 닫지도 않고, 달리 루프를 빠져나갈 방법도 없기 때문에 이 루프는 그야말로 "실패할 때까지" 파일을 계속 새로 열어댑니다. 그걸 의도하신 건 아닌 것 같은데요.

2.

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])

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엔
위의 글이 아니라
첨부한 파일이 들어있습니다.

댓글 첨부 파일: 
첨부파일 크기
Plain text icon code.txt181바이트

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.