2016-11-06 4 views
0

Hier versuche ich meine eigene Realloc-Funktion zu schreiben und ich klebte auf das alte Array in ein neues Array kopieren. Es ist kein Problem, wenn eine Datei nur 16 oder noch weniger Zeichenfolgen pro Zeile enthält. Das Problem tritt auf, wenn die Zeilen über dem ursprünglichen Setup liegen 16. Das bedeutet, dass sich das Problem auf meine realloc-Funktionsimplementierung bezieht, denke ich. In meinem Programm stelle ich drei Schritte ein, um die Änderungen des Arrays zu steuern.Implementierung meiner eigenen Realloc-Funktion in c

Mein Gedanke ist:

Erster Schritt: wenn die Linie der Datei kleiner als oder gleich 16, gibt den Wert

Zweiten Schritt new_array: wenn die Linie der Datei gleich 17, sollte man malloc mehr Raum. Kopiere das alte Array in ein neues Array und gebe die aktuelle Zeile an das letzte Feld weiter

Dritter Schritt: ähnlich dem zweiten Schritt, aber das alte Array ist das vorherige erweiterte Array.

Für jetzt kämpfe ich um herauszufinden, warum es nicht funktioniert. Und wenn meine Datei genau 17 Zeilen hat, zum Beispiel:

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

Das Ergebnis ist

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; 
} 

Mein Hauptfunktionscode wie die folgenden.

#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); 
     } 
    } 
} 

Ich bin gerade verloren ....

+3

Sie nicht genügend Speicher zuordnen. 'malloc' Argument ist die Anzahl der Bytes, aber Sie übergeben die Anzahl der Elemente –

+0

@ M.M meinen Sie das 'malloc' in utitlityFunction.c? Ich habe es versucht ... Aber das Ergebnis hat sich nicht geändert ... So verwirrend, dass es nur die ersten beiden Zahlen und die letzte Zahl gedruckt hat ... – HxH

+0

Solltest du 'countLine' anstelle von' i' als Index für das Array verwenden? ? – alk

Antwort

0

Ich denke, Ihr Problem aus der Memcpy kommt. void * memcpy (void * Ziel, const void * Quelle, size_t num); Sie müssen jeden Fall Ihrer Registerkarte anstelle des Char ** in einem Anruf memcpy. versuchen Sie es

Verwandte Themen