2016-02-28 5 views
1

Может ли кто-нибудь помочь мне понять, почему я получаю ненужные значения в моем массиве? Мой код:Значения нежелательной почты в динамическом массиве

FILE *fp; 
fp = fopen("input.txt", "r"); 

char buffer[5000]; 
int size = 0; 
char *ptr; 
char **fileArrayPTR; 

fileArrayPTR = malloc(sizeof(char*)); 

while (fgets(buffer, 5001, fp) != NULL) { 
    fileArrayPTR[size] = malloc(strlen(buffer) + 1); 
    strcpy(fileArrayPTR[size], buffer); 
    for (int p = 0; p < 5001; p++) { 
     if (fileArrayPTR[size][p] == '\n') { 
      fileArrayPTR[size][p] = '\0'; 
      break; 
     } 
    } 
    //printf("%s\n",fileArrayPTR[size]); 
    size++; 
} 
for (int x = 0; x < size; x++) { 
    printf("%s\n", fileArrayPTR[x]); 
} 

Если я раскомментировать заявление PRINTF перед size++, я получаю правильный результат, но когда я беру, что и попробовать нижнюю часть кода не работает. Он работает для fileArrayPTR[16] или выше, но не от 0 до 15. Также, если я должен был вернуть fileArrayPTR в main, как я мог бы также вернуть размер?

+0

Ознакомьтесь с первым вызовом 'malloc'. – e0k

+0

'fileArrayPTR = malloc (sizeof (char *));': 'fileArrayPTR' может содержать только один указатель. вы можете использовать только 'fileArrayPTR [0]'. Также '5001' ->' 5000' – BLUEPIXY

+0

Я изменил свой код на fileArrayPTR = malloc (5000 * sizeof (char *)), и он работает (тот же самый буфер). Должен ли я сохранить это, правильно ли это соглашение? – FreeStyle4

ответ

0

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

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

char **getlines(int *sizep) { 
    FILE *fp; 
    char buffer[5001]; 
    int size = 0; 
    char **fileArrayPTR = NULL; 

    fp = fopen("input.txt", "r"); 
    if (fp == NULL) { 
     *sizep = -1; 
     return NULL; 
    } 

    while (fgets(buffer, 5001, fp) != NULL) { 
     fileArrayPTR = realloc(fileArrayPTR, sizeof(*fileArrayPTR) * (size + 1)); 
     fileArrayPTR[size] = strdup(buffer); 
     for (int p = 0; p < 5001; p++) { 
      if (fileArrayPTR[size][p] == '\n') {  
       fileArrayPTR[size][p] = '\0'; 
       break; 
      } 
     } 
     //printf("%s\n", fileArrayPTR[size]); 
     size++; 
    } 
    *sizep = size; 
    return fileArrayPTR; 
} 

int main(void) { 
    int size; 
    char **array = getlines(&size); 
    for (int x = 0; x < size; x++) { 
     printf("%s\n", array[x]); 
    } 
    return 0; 
} 

Обратите внимание, что buffer должны быть определены с размером 5001 для согласованности с остальной частью коды.

Вы можете вернуть size в main, установив переменную, которой вы передаете указатель, как показано выше.

+0

@BLUEPIXY: oops! исправлено. Я обновил код с надлежащим прототипом и основной функцией. – chqrlie

+0

Лучше быть «свободным» для начинающих :) – BLUEPIXY

+0

Когда я вызываю char ** array = getlines (& size), он возвращает 0 для размера – FreeStyle4

Смежные вопросы