2017-01-29 1 views
3

Vous cherchez de l'aide avec mon programme C. C'est quelque chose que je dois faire pour l'école. Je pense que je suis proche mais j'ai toujours des problèmes pour imprimer correctement le résultat. Ce programme se compose de 4 fichiers de fonction .c.Tableaux de chaînes avec pointeurs en C

Pour une raison quelconque, je n'arrive pas à sortir le programme correctement, mais je n'arrive pas à comprendre pourquoi. Peut-être que quelqu'un ici peut attraper ce que je fais mal. Tous les conseils seraient très appréciés. Je suis nouveau à la programmation. Les fonctions et les paramètres nous sont donnés, et nous devons en trouver l'intérieur.

Les fonctions sont censées créer et accéder à un tableau de chaînes en utilisant l'allocation dynamique avec des pointeurs et des mallocs.


1: createStringArray.c alloue dynamiquement un tableau de pointeurs qui pointera vers Cordes

#include <stdlib.h> 

char** createStringArray(int number){ 
    return malloc((sizeof(char*))*number); 
} 

2: magasins setStringArray.c une chaîne dans le réseau, la chaîne passe dans la La fonction doit avoir déjà de la mémoire et doit être copiée dans l'espace. pour les paramètres: matrice se réfère au tableau alloué dans la partie 1, l'indice est l'endroit où la chaîne est stockée, et la chaîne est la chaîne à transmettre dans

#include <stdlib.h> 

void setStringArray(char** array, int index, char* string){ 
    array[index] = &*string; 
} 

3:. getStringArray.c est censé renvoyer une chaîne à partir du tableau sur la base du paramètre index

char* getStringArray(char** array, int index){ 
    return (char*)array[index]; 
} 

4: freeStringArray.c est censée libérer la matrice

#include <stdlib.h> 

void freeStringArray(char** array, int number){ 
    free(array); 
} 

On nous donne également une ligne principale de test à utiliser. J'ai également déclaré les fonctions dans arrayDefns.h.

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

#include "arrayDefns.h" 

#define MAXSIZE 100 

int main () 
{ 
    char **arrayPtrs; 
    char *string; 
    char inputStr[MAXSIZE+1]; 
    int number; 
    int i; 

    number = 4; 
    printf ("arrayPtrs = createStringArray (%d)\n\n", number); 
    arrayPtrs = createStringArray (number); 

    for (i=0; i<number; i++) { 
     printf ("Enter a string: "); 
     fgets (inputStr, MAXSIZE, stdin); 
     inputStr[strlen(inputStr)-1] = '\0'; 
     string = malloc (sizeof(char) * (strlen(inputStr)+1)); 
     strncpy (string, inputStr, strlen(inputStr)+1); 
     printf ("setStringArray (arrayPtrs, %d, %s)\n", i, string); 
     setStringArray (arrayPtrs, i, string); 
     free (string); 
    } 

    printf ("\n"); 

    for (i=0; i<number; i++) { 
     string = getStringArray (arrayPtrs, i); 
     printf ("%s = getStringArray (arrayPtrs, %d)\n", string, i); 
    } 

    printf ("\nfreeStringArray (arrayPtrs, %d)\n", number); 
    freeStringArray (arrayPtrs, number); 

    return(0); 
} 

Actuellement la sortie que je reçois est correcte, jusqu'à la dernière partie où il est censé imprimer « % s = getStringArray », mais la partie de % n'imprime pas correctement.

+0

Essayez de supprimer la ligne 'free (string);' pour voir si cela fonctionne un peu mieux ... –

+0

@ Joël l'appel à 'free' est dans le code de test, qu'ils sont censés ne pas modifier. –

+0

Un 'char *' n'est pas une chaîne. Il se peut que * pointe * le 1er élément d'une chaîne. Vous avez donc * besoin * de définir (allocation implicite) la "chaîne" réelle séparément. – alk

Répondre

0

Vous ne devriez pas libérer la variable "chaîne" car elle pointe toujours sur les données et vous effacez ces données; il suffit de retirer la ligne de code:

free (string); 

Et cela fonctionnera.

+0

une raison quelconque pour le downvote? La réponse est, si on ne sait pas dire tout et je vais vous expliquer mieux – Kroj

+1

L'appel à 'free' est dans le code de test, dont ils sont censés ne pas modifier. –

+0

qui n'a pas été écrit dans la question, votre réponse était bonne mais la mienne était juste une approche différente – Kroj

3

Dans le setStringArray, vous êtes censé copier la chaîne (qui est la séquence réelle des caractères). Actuellement, vous ne faites que copier un pointeur. Pour ce faire, vous avez besoin des fonctions strlen, malloc et memcpy/strcpy. Cette fonction sera plus compliquée que les autres.

Vous pouvez également utiliser la fonction strdup, mais cette fonction n'est pas garanti d'être disponible sur toutes les plates-formes C.

+0

Merci beaucoup! Je l'ai eu à travailler en utilisant vos suggestions. –