2017-01-30 4 views
0

파일에서 일부 문자열을 읽고 문자열 배열로 복사하려고합니다. 왜 세그멘테이션 오류가 발생하기 전에 파일의 첫 번째 문자열 만 제대로 읽는 지 이해할 수 없습니다. 파일의 각 문자열에는 최대 50 자까지 입력 할 수 있습니다.파일에서 문자열 읽기 및 배열로 복사 - C

... 

int i = 0; 
char s[50]; 
int N=0; 
FILE *fp; 

//Figures out how many strings are stored in the file 
while(fgets(s, 50, fp)!=NULL){N++} 

rewind(fp); 

char *strings[N]; //This is the array where I want to store strings 

for(i=0;i<N;i++){ 

    fgets(s, 50, fp); 
    strcpy(strings[i], s); 
    printf("%s", s); 
} 

왜 배열에 문자열을 성공적으로 저장할 수 없습니까?

+0

초기화되지 않은 포인터와 함께 'strcpy'를 사용할 수 없습니다.'strdup'를 사용하십시오 : strings [i] = strdup (s) ;' –

+1

힌트 :'char * strings [N]'은 N 개의 포인터로 구성된 배열이지만 초기화 된 것은 하나도 없다. 각 포인터는 일부 미정의 메모리 위치를 가리 킵니다. –

+0

@MichaelWalz : 고마워요! 그래서 strcpy 사용할 수 있지만 각'string [i]'포인터를 초기화해야합니다. fgets() 이후에'strings [i] = (char *) malloc (50 * sizeof (char)); '과 같은 것을 사용해야한다고 생각합니까? – davideAlbertini

답변

0

는 두 가지 실수를하고있다 :

1 문자열을 복사 할 때 대상이 문자열 인 경우 기억 하시죠, 당신은 대상에 대한 메모리를 할당 할 필요가 [I] 당신이 어떤 메모리

에게 할당하지 않은 당신이 벡터를 사용하지 않는 경우, 당신이 가지고

#define MAX_STRINGS 100 
    int i = 0; 
    char s[50]; 
    int N=0; 
    while(fgets(s, 50, fp)!=NULL){N++;} 
    char strings[MAX_STRINGS][50]; 

    rewind(fp); 
    for(i=0;i<N && i<MAX_STRINGS;i++){ 

     fgets(s, 50, fp); 
     strcpy(strings[i], s); 
     printf("%s", s); 
    } 

참고 :

2 귀하의 문자열은 널 (null)이 코드는 작동합니다

을 종료해야합니다 기본적으로 배열의 크기는 상수 여야합니다.