2012-06-10 5 views
0

나는 라인으로 텍스트 파일의 라인을 읽고 배열의 위치에 각 줄을 저장하는 C 코드의 조각을 만든 :C : 문자열을 "char * myArray [100]"배열에 저장하는 방법은 무엇입니까?

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

static const int MAX_NUMBER_OF_LINES = 100000; 
static const char filename[] = "file.csv"; 

int main (void) 
{ 

    // Read file and fill the Array 
    char *myArray[MAX_NUMBER_OF_LINES]; 
    int numberLine = 0; 
    FILE *file = fopen (filename, "r"); 
    if (file != NULL) 
    { 
     char line [128]; 
     while (fgets (line, sizeof line, file) != NULL) 
     { 
      myArray[numberLine] = line; 
      numberLine++;  
     } 
     fclose (file); 
    } 

    // Print the Array 
    for (int i = 0; i<numberLine; i++) 
    { 
    printf("%d|%s", i, myArray[i]); 
    } 
} 

하지만 배열을 인쇄 할 때, 비어입니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

+0

해당 배열은 문자열에 대한 포인터 만 저장할 수 있으며 문자열을 저장할 수 없습니다. 정확히 무엇이 잘못되었는지, 모든 요소는 동일한 변수를 가리 킵니다. strdup()를 고려하십시오. –

+0

그 변수는'if' 블록에 국한되어 있기 때문에 더 이상 존재하지 않습니다. –

+0

어떤 유용한 대답이라도 투표하고 받아 들일 수있는 가장 좋은 대답을 선택하십시오 –

답변

4

배열의 버퍼에 줄을 복사해야하기 때문에.

배열의 각 요소에 문자열을위한 공간을 할당 한 다음 strncpy과 같은 것을 사용하여 각 line을 각 myArray 슬롯으로 이동해야합니다.

현재 코드에서는 line 버퍼에있는 동일한 참조를 각 배열 슬롯에 복사하기 때문에 결국 각 슬롯 myArray은 메모리의 동일한 문자열을 가리켜 야합니다.

는 Shoaib의 제안에 따라 경찰,에서는 StrDup가 가능한 경우 단계를 저장, 그래서 시도 할 것이다 :

myArray[i] = strdup(line); 

이 없음 오류 처리, strncpystrdup의 문서를 참조하십시오.

는 다른 방법으로 당신은 단지 myArray에 치수를 추가 할 수 있습니다

char myArray[MAX_NUMBER_OF_LINES][100]; 
+2

그의 시스템에'strdup'이 있다면'myArray [numberLine] = strdup (line);'가 작동해야한다고 생각합니다. – Shoaib

1

당신은 정말 모든 문자열을위한 공간을 할당해야 할뿐만 아니라 존재하지 않는 문자열에 대한 포인터. 귀하의 예제에서 할당 된 모든 포인터는 범위를 벗어나는 변수를 가리 킵니다. 문자의

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

static const int MAX_NUMBER_OF_LINES = 100000; 
static const int MAX_LINE_LENGTH = 127; 
static const char filename[] = "file.csv"; 

int main (void) 
{ 

    // Read file and fill the Array 
    char myArray[MAX_NUMBER_OF_LINES][MAX_LINE_LENGTH + 1 /* for 0 byte at end of string */]; 
    int numberLine = 0; 
    FILE *file = fopen (filename, "r"); 
    if (file != NULL) 
    { 
     while (fgets (myArray[numberLine], MAX_LINE_LENGTH + 1, file) != NULL) 
     { 
      numberLine++;  
     } 
     fclose (file); 
    } 

    // Print the Array 
    for (int i = 0; i<numberLine; i++) 
    { 
    printf("%d|%s", i, myArray[i]); 
    } 
} 
1

배열 * 포인트 chararray 라인,하지만 당신은 배열의 각 라인을 저장에서 myArray [수직선] 그것을 가리켜 야 :


#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

static const int MAX_NUMBER_OF_LINES = 100000; 
static const char filename[] = "file.csv"; 

int main (void) 
{ 

    // Read file and fill the Array 
    char *myArray[MAX_NUMBER_OF_LINES]; 
    int numberLine = 0; 
    FILE *file = fopen (filename, "r"); 
    if (file != NULL) 
    { 
     char line [128]; 
     while (fgets (line, sizeof line, file) != NULL) 
     { 
      //refinement is hre 
      myArray[numberLine] = (char*)malloc(sizeof line); 
      strcpy(myArray[numberLine], line); 
      numberLine++;  
     } 
     fclose (file); 
    } 

    // Print the Array 
    for (int i = 0; i<numberLine; i++) 
    { 
    printf("%d|%s", i, myArray[i]); 
    free(myArray[i]) 

    } 
} 
+0

할당 된 메모리를 해제해야합니다. – Ruben

+0

뭐가 문제일까요? –

+0

ok, 무료()가 추가되었습니다. –

관련 문제