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 ....
vous n'allouez pas assez de mémoire. L'argument 'malloc' est le nombre d'octets, mais vous passez le nombre d'éléments –
@ 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
Ne devriez-vous pas utiliser 'countLine' au lieu de' i' comme index au tableau ? – alk