2014-10-31 2 views
0
#include<stdio.h> 
#include<string.h> 
#include <stdlib.h> 

#define ARRAY_MAX 100 

int main() { 

    FILE *input, *output; 
    char *token[100]; 
    char buf[100]; 
    int count = 0; 
    input = fopen("/Users/home/Desktop/test.txt", "r"); 
    output = fopen("/Users/home/Desktop/test2.txt", "w"); 

    while (fgets(buf, sizeof(buf), input) != NULL) { 
     token[count] = strtok(buf, "\n"); 
     ++count; 
    } 

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

    printf("%d\n\n" ,count); 
    return 0 ; 

} 

이 코드를 실행하면 내가받을 오히려배열이 제대로 증가하지

라인 3

라인 3

라인 3

같은 출력 결과를 얻는 것보다

줄 1

,

라인이

라인 3

얼마나 내가 일을 잘못?

+0

귀하의 의견을 게시하시기 바랍니다 : 당신이해야 할 것은 읽을 때마다 새로운 라인을위한 메모리를 할당하고 새로 할당 된 메모리에 내용을 버퍼의을 복사합니다. –

+0

'token [count] = strtok (buf, "\ n");' "string"-token을 복사하지 않습니다. – alk

+0

입력에 100 개 이상의 행이 포함되어 있으면 어떻게됩니까? – user3629249

답변

2

strtok()이 매번 동일한 buf에서 실행되므로 매번 동일한 주소가 반환됩니다. 루프가 완료되면 마지막으로 읽은 값이 버퍼에 있으므로 인쇄됩니다.

while (fgets(buf, sizeof(buf), input) != NULL) { 
    token[count] = strdup(strtok(buf, "\n")); 
    ++count; 
} 
1

할당

token[count] = ... 

단순히 복사 포인터로 버퍼의 주소 :

당신은 복사 라인의을 저장할. 그런 다음 동일한 버퍼를 다시 사용하고 동일한 주소를 배열의 다음 요소로 복사하십시오.

token[count] = malloc(strlen(buf) + 1); // +1 for trailing 0 
strcpy(token[count], buf); 
관련 문제