2014-04-20 3 views
0

나는 가지고있다. 나는이 코드를 가지고 있는데, 첫 부분은 좋은 뜻이다. 왜냐하면 디버그 코드 (나는 배열을 저장하고 잘 보이는 것)를 인쇄하기 때문이다. 하지만 배열 inst에 내가 원하는. 내가 파일파일에서 로딩하여 배열에 저장

나는이 형식으로 이름이 :

Peter News 
Martin Clear 
. 
. 
. 

만 마지막 줄에 내 코드를 인쇄 할 수 있습니다. 배열에 다른 줄을 인쇄 해보려고합니다. 그러나 처음이나 마지막 줄은 마지막 줄입니다. 나는 everthink를 시도하지만 작동하지 않습니다.

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

int main() 
{ 
    FILE *soubor; 
    char radek[80]; 
    char *data[100]; 
    int pos = 0; 
    int i; 

    soubor = fopen("names.txt","r"); 

    while(fscanf(soubor,"%[^\n]", radek) != EOF){ 
     getc(soubor); 
     data[pos] = radek; 
     printf("%d radek = %s pole = %s \n", pos, radek, data[pos]); // debug 
     pos++; 
    } 

    for(i=0;i<100;i++){ 
     printf("%s \n",data[i]); 
    } 

    return 0; 
} 
+0

'data [pos] = radek;', 그 내용은 마지막 것과 같을 것입니다. 그냥 포인터를 복사하고 있기 때문입니다. – BLUEPIXY

답변

1

불행하게도, C 당신이 잘 모르는 경우이 점에서 사용이 매우 직관적되지 않을 수 있습니다 여기에

는 간단한 코드입니다.

radek 버퍼에 개별 라인을 저장하고 각각의 새로운 라인을 덮어 쓰려고합니다. data에서 동일한 포인터를 radek에 계속 저장하면 결국 마지막 내용이 100 번 인쇄됩니다.

이처럼 저장하는 strdup()를 사용해야합니다 :

data[pos] = strdup(radek); 

는 힙에 radek에서 문자열의 복사본을 할당하고 당신이 필요로 할 것입니다.


그러나 사용은 정적으로 크기의 버퍼를 사용하여 올바른로 후 버퍼 오버 플로우에 관한 위험 free()으로 메모리를 해제해야처럼 더 많은 문제가, 다음, 거기는 처리 많은 오류 등

이 없다

예를 들어 볼 수도 있습니다. 대답 here에는 텍스트 파일 행을위한 동적 저장소 구현이 있습니다.