2013-02-08 2 views
-1

Я пытаюсь читать последовательные строки из файла и указывать на них указателем на массив строк. Но только первая строка выводится как ожидалось, после чего выход не отображается по желанию.не получает токены из файла?

input.txt: 
Hi i am Michel 
hello swing 
how are you 

о/р:

LINE[1]=Hi i am Michel 
st_arr[0]=Hi 
st_arr[1]=i 
st_arr[2]=am 
st_arr[3]=Michel 

LINE[2]=hello swing 
st_arr[0]=Hi 
LINE[3]=how are you 
st_arr[0]=Hi 

Вот мой код:

main() 
{ 
    int i = 0,j=0,k=0,p=0; 
    char lines[10][ 50]; 
    char words[10]; 
    char *st_arr[20]; 
    FILE *fp = fopen("input.txt", "r"); 
    while (fgets(lines[i], sizeof(lines[i]), fp)) 
    { 
     lines[i][strlen(lines[i])-1] = '\0'; 
     i = i + 1; 
    } 
    fclose(fp); 
    printf("The value of i=%d\n",i); 
    for(j=0;j<i;j++) 
    { 
     printf("LINE[%d]=%s\n",j+1,lines[j]); 
     { 
      char *token=strtok(lines," "); 
      while(token!=NULL) 
      { 
       st_arr[p]=malloc(strlen(token)+1); 
       strcpy(st_arr[p],token); 
       printf("\tst_arr[%d]=%s\n",p,token); 
       token=strtok(NULL," "); 
       p++; 
      } 
     } 

     bzero(st_arr[j],sizeof(st_arr)); 
     p=0; 

    } 
} 

Есть ли какие-либо проблемы, которые я явно пропавшие Somethings?

+2

Этот код выглядит как надлежащая запись IOCCC. – 2013-02-08 19:28:23

+3

Швы как вам нужно познакомиться с отладчиком. Если вы используете систему на базе Linux, я бы рекомендовал GDB ... –

+0

Какой размер 'input.txt'? можете ли вы включить содержимое? – SparKot

ответ

1

Похож линией:

bzero(st_arr[j],sizeof(st_arr)); 

Является ли переполнение буфера, что тромпы стеков, очищая часть буфера 'строки.

Не говоря уже о утечке памяти сделана при наличии bzero стереть эти распределения в st_arr:

st_arr[p]=malloc(strlen(token)+1); 

Другой ошибка в том, что вы нулевая набивке между каждой строкой, считанной из файла, то вы strtok из первой строки:

char *token=strtok(lines," "); 

Это будет означать только до нулевого значения и, следовательно, пропустить все последующие строки. Возможно, вы имели в виду:

char *token=strtok(lines[j]," ");