c언어 2차원배열에 파일입력받기질문

조회수 6090회
#define _CRT_SECURE_NO_WARNINGS   
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define w 5
#define h 16
pt_buffer(char buffer[w][h])//배열출력함수
{
    int i = 0;
    while (buffer[i][0] != '\0')
    {
        printf("%s", buffer[i]);
        i++;
    }

}
int main()
{
    FILE *fp = fopen("indata.txt", "w");

    fputs("-----I-I------\n"
          "----I---I-----\n"
          "----I----IIII-\n"
          "----I----IIII-\n",
          fp);
    // 파일에 문자열 저장

    fclose(fp);
    // 파일 포인터 닫기

    char buffer[4][14];
    // 파일을 읽을 때 사용할 임시 공간
    int i = 0;
    FILE *ff = fopen("indata.txt", "r");
    // hello.txt 파일을 읽기 모드로 열기.  
    memset(buffer, NULL, 4 * 14);
    // 파일 포인터를 반환
    while (!feof(ff))
    {
        fgets(buffer[i], 14, ff);
        i++;
    };
    // Hello, world!: 파일의 내용 출력
    i = 0;
    fclose(ff);
    while (buffer[i][0] != NULL)
    {
        printf("%s", buffer[i]);
        i++;
    }

    return 0;
}

이 코드가 실행은 되는데 왜 디버그가 뜨는지 모르겠어요...

1 답변

  • 디버그란 프로그램의 오류를 해결하기 위한 행위를 말하는 것이지, 프로그램 동작시 발생하는 문제를 지칭하지 않습니다.

    C언어에서 문자열이란 마지막에 \0이 포함됩니다. 만약 14자의 문자를 갖는 문자열일 경우 배열으 크기는 15이어야 합니다.

    그리고 while (buffer[i][0] != NULL)와 같은 방법식으로 배열의 끝을 판단하기 위해서는 배열이 실제 담고 있을 원소보다 하나더 커야합니다. 따라서 char buffer[4][14];가 아닌 char buffer[5][15];가 되어야 됩니다.

    하지만 여기서 한가지 문제가 있습니다. fgets(buffer[i], 14, ff); 이렇게 호출한다면 최대 14자가 아닌 13자의 글자를 읽어 들입니다. 여기서 입력한 두번째 인자란 첫번째 인자의 크기를 의미합니다. 문자열이기 때문에 마지막 한 자리는 \0을 위해 사용됩니다. 그렇다고 fgets(buffer[i], 15, ff);로 바꾸면 14자를 읽어 들이겠지만 여기서도 문제가 발생합니다.

    파일에는 각 줄당 -----I-I------\n와 같이 14자 + 1자가 저장되어 있습니다. 만약 아래와 같이 실행한다면

    fgets(buffer[0], 15, ff);
    fgets(buffer[1], 15, ff);
    

    buffer[0]-----I-I------이 되고 buffer[1]\n----I---I----이 될 것입니다. 그렇기에 15자를 읽도록 작성해야 buffer[0]-----I-I------\n, buffer[1]----I---I-----\n이 될 것 입니다.

    위에서 언급한 내용을 반영하면 아래와 같습니다.

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    int main()
    {
        FILE *fp = fopen("indata.txt", "w");
    
        fputs("-----I-I------\n"
              "----I---I-----\n"
              "----I----IIII-\n"
              "----I----IIII-\n",
              fp);
        // 파일에 문자열 저장
    
        fclose(fp);
        // 파일 포인터 닫기
    
        char buffer[5][16];
        // 파일을 읽을 때 사용할 임시 공간
        int i = 0;
        FILE *ff = fopen("indata.txt", "r");
        // hello.txt 파일을 읽기 모드로 열기.
        memset(buffer, 0, sizeof(buffer));
        // 파일 포인터를 반환
        while (!feof(ff))
        {
            fgets(buffer[i],  16, ff);
            i++;
        };
        // Hello, world!: 파일의 내용 출력
        i = 0;
        fclose(ff);
        while (buffer[i][0] != '\0')
        {
            printf("%s", buffer[i]);
            i++;
        }
    
        return 0;
    }
    
    • 하지만 파일을 행이 4열이고 열이 14인 배열에 입력받아져야해서 배열을 변경할수는 없어요.. 알 수 없는 사용자 2018.9.27 13:52
    • 말씀하신대로 변경해봤는데 결과가 4줄 14열로 나와햐는데 결과가 다르게 나와요.. 알 수 없는 사용자 2018.9.27 14:10
    • 디버그는 안뜨는데 원래 만드려던 결과인 프린트 f의 내용들이 뒤섞여서 나와요.. 알 수 없는 사용자 2018.9.27 14:18
    • 제가 착각을 했네요. 다시 답변 달겠습니다. 유동욱 2018.9.27 14:41
    • 감사합니다 2시간동안 이거 저거 바꾸어보고 인터넷 뒤져봐도 해결이 안되서요 ㅜㅠ 알 수 없는 사용자 2018.9.27 15:05
    • 감사합니다 2시간동안 인터넷 뒤져보고 이거 저거 만져봐도 해결이 안되서요.. 알 수 없는 사용자 2018.9.27 15:06
    • 하나 더 질문해도 될까요? 알 수 없는 사용자 2018.9.29 12:06
    • 문자열 한개당 배열 인덱스 하나를 차지하도록 코딩하고 싶으면 어떻게 해야할까요?? 알 수 없는 사용자 2018.9.29 12:07
    • 예를 들어 printf('%s',buffer[1][0]) 결과 값은 - 가 나오도록요 알 수 없는 사용자 2018.9.29 12:08
    • 2차 배열이 아닌 1차 배열을 사용하고 싶으시단 말씀인가요? printf('%s',buffer[1][0]) 이것이 뭘 의미하는지 잘 모르겠습니다. 유동욱 2018.9.29 12:21
    • 제가 미로찾기 게임을 만드는것인데 배열인덱스 한개당 벽아니면 길이 배열되도록 만들어야해요 '-'은 길이고 'I'는 벽인 셈입니다 알 수 없는 사용자 2018.9.29 12:25
    • 올려주신 코드에는 배열buffer[0]에 한줄이 다들어간셈이잖아요? 제가 필요한 것은 buffer[0][0]에 문자열 하나 buffer[0][1]에 문자열 하나 이런식으로 문자열을 할당해야해요.. 알 수 없는 사용자 2018.9.29 12:26
    • fread 함수로 만들어보려고했는데 잘안돼서요 알 수 없는 사용자 2018.9.29 12:27
    • 문자열이란 문자의 나열입니다. 일종의 문자배열 이라고 생각하시면 됩니다. buffer[0][0]은 문자 하나입니다. 여기서 '-'인지 'I'를 비교하면 된답니다. 즉, 이미 원하시는 내용이 가능한 코드입니다. 유동욱 2018.9.29 12:30
    • 감사합니다!! 알 수 없는 사용자 2018.9.29 12:39
    • 하나 더 질문해도 될까요 선생님?? 알 수 없는 사용자 2018.9.30 13:12
    • 배열을 출력하는 부분을 함수로 만들어서 편하게 쓰고 싶은데 자꾸 오류가 뜨네요.. 알 수 없는 사용자 2018.9.30 13:13
    • #pt_buffer(char buffer[w][h])//배열출력함수 { int i = 0; while (buffer[i][0] != '\0') { printf("%s", buffer[i]); i++; } } 알 수 없는 사용자 2018.9.30 13:13
    • #define w 5 #define h 16 pt_buffer(char buffer[w][h])//배열출력함수 { int i = 0; while (buffer[i][0] != '\0') { printf("%s", buffer[i]); i++; } } 알 수 없는 사용자 2018.9.30 13:14
    • 이런식으로 만들고싶은데 오류가 나요 ㅠ 알 수 없는 사용자 2018.9.30 13:14
    • 위에 질문수정하여 코드 올렸습니다 알 수 없는 사용자 2018.9.30 13:15

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)