2016-11-06 1 views
0

Ici, j'essaye d'écrire ma propre fonction realloc et je me suis contenté de copier l'ancien tableau dans un nouveau tableau. Ce n'est pas un problème si un fichier contient seulement 16 ou moins de chaînes à chaque ligne. Le problème se produit lorsque les lignes sur l'installation d'origine 16. Ce qui signifie que le problème se réfère à ma mise en œuvre de la fonction realloc je pense. Dans mon programme, j'ai mis trois étapes pour contrôler les changements de tableau.implémentation de ma propre fonction realloc dans c

Ma pensée est:

Première étape: lorsque la ligne du fichier inférieur ou égal à 16, donner la valeur à new_array

Deuxième étape: lorsque la ligne égale à 17 du fichier, devrait malloc un plus espace. copier l'ancien tableau dans un nouveau et donner la ligne en cours au dernier espace

Troisième étape: similaire à la deuxième étape, mais l'ancien tableau est un tableau étendu précédent.

Pour l'instant, j'ai du mal à comprendre pourquoi cela ne fonctionne pas. Et quand mon dossier a exactement 17 lignes, par exemple:

1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 

Le résultat est

here start 
1 

2 

(null) 
(null) 
(null) 
(null) 
(null) 
(null) 
(null) 
(null) 
(null) 
(null) 
(null) 
(null) 
(null) 
(null) 
17 

The file 'foo' had 17 lines. 

utitlityFunction.c

#include "utilityFunction.h" 
#include <stdlib.h> 
#include <string.h> 
#include <stdlib.h> 

char **extendArray(char **oldArray, int oldLen, int newLen){ 
    char **newptr = malloc(newLen * sizeof (char*)); //updated here. No changed for result 
    // if(newptr == NULL){ 
    // perror("Failed to allocate"); 
    // exit(1); 
    // } 
    memcpy(newptr, oldArray, oldLen); 
    free(oldArray); 
    return newptr; 
} 

Mon principal code de fonction comme suit.

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

int main(int argc, char**argv){ 
    FILE *filename; 
    size_t len = 0; 
    char *line = NULL; 
    int index; 
    int countLine = 0, i = 0; 
    char** new_array = malloc(16 * sizeof(char*)); 
    char** extended_array; 
    char* current_line; 

    for(index = 1; index < argc; index++){ //loop for all files name you input in the command line 
     filename = fopen(argv[index], "r"); 
     if(filename == NULL){ 
      printf("The file '%s' did not exist.\n", argv[index]); 
     }else{ 
      while(getline(&line, &len, filename)!=EOF){ 
       current_line = strdup(line); 
       if(new_array == NULL){ 
        perror("Failed to allocate"); 
        exit(1); 
       } 
       if(i<16){ 
        new_array[i] = current_line; 
       } 
       else{ 
        if(i==16){ //actually index 17 
         extended_array = extendArray(new_array, i, countLine); 
         extended_array[i] = current_line; 
        }else{ 
         printf("aaa?\n"); 
         extended_array = extendArray(extended_array, i, countLine); 
         extended_array[i] = current_line; 
        } 
       } 
       i++; 
       countLine++; 
      } 
      //mprintf("%s\n", extended_array[0]); 
      //mprintf("-->m%d\n", countLine); 
      printf("here start\n"); 
      int j; 
      for(j = 0; j < countLine; j++){ 
       printf("%s\n", extended_array[j]); 
      } 
      //print line result after end of file 
      printf("The file '%s' had %d lines.\n", argv[index], countLine); 
     } 
    } 
} 

Je suis juste perdu ....

+3

vous n'allouez pas assez de mémoire. L'argument 'malloc' est le nombre d'octets, mais vous passez le nombre d'éléments –

+0

@ M.M voulez-vous dire le 'malloc' dans utitlityFunction.c? J'ai essayé ... Mais le résultat n'a pas changé ... Donc confondant ce qu'il imprime seulement les deux premiers nombres et le dernier nombre ... – HxH

+0

Ne devriez-vous pas utiliser 'countLine' au lieu de' i' comme index au tableau ? – alk

Répondre

0

Je pense que votre problème vient du memcpy. void * memcpy (destination void *, const void * source, taille_t num); Vous devez enregistrer chaque cas de votre onglet au lieu du caractère ** en un seul appel. essayez-le