2014-09-24 4 views
0

그래서 나는 다차원 배열 형태로 저장된 스프레드 시트를 가지고 있으며 행의 내용을 인쇄하는 함수를 만들려고합니다. 불행히도 첫 번째 값만 인쇄하는 것처럼 보이고 나머지 인쇄물은 공백으로 표시됩니다. 이것에 대한 이유는 무엇일까요?다차원 배열 인쇄 첫 번째 열을 인쇄합니다

// Outputs the specified row of the spreadsheet. 
// It is printed as one line on standard output. 
void SS_PrintRow(SPREADSHEET *ss, int rowNum) { 
    if (debug) 
     fprintf(stderr, "DEBUG: Call to SS_PrintRow(--,%d)\n", rowNum); 
    // TO BE COMPLETED! 
    if(rowNum >= MAXROWS || rowNum < 0){ 
     printf("-- row number outside range\n"); 
     return; 
    } 
    SPREADSHEET read; 
    memcpy(&read,ss,sizeof(*ss)); 
    int i; 
    for(i = 0; i < MAXCOLS ;i++){ 
     read.contents[rowNum][i][MAXLEN] = '\0'; // force null termination 
     printf("%s ",read.contents[rowNum][i]); 
    } 
    return; 
} 

행 값 :

Jane,24,122.3,brunette 

출력 :

Jane 

EDIT : 여기서 스프레드 시트 구조체이다.

struct SpreadSheet { 
    char *fileName; 
    int numRows; 
    int numCols; 
    char contents[MAXROWS][MAXCOLS][MAXLEN]; 
}; 

typedef struct SpreadSheet SPREADSHEET; 
+1

1) '스프레드 시트'의 완전한 정의를 게시하면 도움이됩니다. 2)주의 :'memcpy (& read, ss, sizeof (* ss));'는'read = * ss;'처럼 깨끗합니다. – chux

+0

SPREADSHEET의 정의가 추가되었습니다. 또한, memcpy는 당신이 말한 것처럼 형식화되어 있습니다, 그렇지 않습니까? – user3283585

+0

게시물에 대한 답변을 작성해 주셔서 감사합니다. 내 의견에 관해서는'memcpy()'가 아니라'read = * ss;'를 사용하는 것이 좋습니다. – chux

답변

0

귀하의 오류가 여기에 있습니다 :

read.contents[rowNum][i][MAXLEN] = '\0' 

이 하나 개의 요소에 의해 배열의 경계를 초과합니다. C 기반 배열은 0...(len-1)으로 인덱싱됩니다. 당신의 구조가 정의와 함께 :

struct SpreadSheet 
{ 
    char *fileName; 
    int numRows; 
    int numCols; 
    char contents[MAXROWS][MAXCOLS][MAXLEN]; 
}; 

잘못된 행은 다음과 같습니다

read.contents[rowNum][i][MAXLEN-1] = '\0'; 

내가 rowNum기도는 비록 그것이 아마 최소 표시에-뿐만 아니라 제대로 제로입니다.

+0

이렇게하면 나머지는 인쇄되지만 이제는 가비지 문자도 인쇄됩니다. 그 이유는 내가 그 줄을 시작해야하는 이유이기도합니다. 쓰레기를 피하기 위해 다른 것을해야합니까? – user3283585

+0

@ user3283585 원래 문자열을 채우는 코드는 종료되지 않을 가능성이 높습니다. 이 코드는 여기에 표시되지 않습니다. 솔직히 말해서 코드가 처음에 문자열을 제대로 종료했다면이 종료가 먼저 이루어져야 할 이유가 없습니다. – WhozCraig

+0

rowNum은 0부터 시작합니다. – user3283585

관련 문제