2017-06-08 1 views
-1

OK J'ai travaillé sur ce code pendant environ un jour et demi maintenant et je me suis dit que j'aurais compris pourquoi cela ne fonctionnait pas.Codage C avec insertion de char * dans la pile

1 - dit que je suis passer des arguments à un paramètre (mais bien exécute)

2 - ne fait que repousser la première lettre de mon char* à la pile et non la chaîne entière

#include <stdio.h> 
#include <stdlib.h> //malloc and free 
#include <limits.h> 
#include <ctype.h> 
#include <string.h> 

char* getMooki(); 
void push(char* val, char* val2, int a); 
void printStack(); 
void error(char* msg); 

typedef struct node{ 
    char* data; 
    char* date; 
    int p_price; 
    struct node *pNext; 
}node; 

node *pTop = NULL; 

int main(int charc, char* argv[]){ 

    int pushVal = 2; 
    push("Light","Best", 1); 
    printStack(); 
    push("Moon","Good", 2); 
    printStack(); 
    char* good; 
    good = getMooki(); 
    push(&good,"tada", 3); 
    printStack(); 
    good = getMooki(); 
    push(&good,"work please", 4); 
    printStack(); 
} 

void push(char* val, char* val2, int a){ 

    if(pTop == NULL){ 
     pTop = malloc(sizeof(node)); 
     pTop -> data = val; 
     pTop -> date = val2; 
     pTop -> p_price = a; 
     pTop -> pNext = NULL; 
    }else{ 
     node *pNew = malloc(sizeof(node)); 
     pNew -> data = val; 
     pNew -> date = val2; 
     pNew -> p_price = a; 
     pNew -> pNext = pTop; 
     pTop = pNew; 
    } 

} 

void printStack() { 
    //get temporary pointer: 
    node *pTemp = pTop; 
    if (pTemp == NULL) { 
     error("Print error: stack empty"); 
     return; 
    } 
    //walk down the stack, printing each value: 
    do { 
     printf("%s ", pTemp -> data); 
     printf("%s ", pTemp -> date); 
     printf("%d \n", pTemp -> p_price); 
     pTemp = pTemp -> pNext; 
    } while (pTemp != NULL); 
    printf("\n"); 
} 

void error(char* msg) { 
    printf("%s\n", msg); 
} 

char* getMooki(){ 
    char* input; 
    printf("Enter your string: "); 
    scanf("%s", &input); 
    return input; 
} 

OK J'ai le code ci-dessus qui fonctionne quelque peu ... Je sais que j'ai un problème de mémoire/pointeur et j'ai du mal à trouver des documents liés à ce que j'essaie de faire car cela implique de passer un caractère * dans C est ce qui se passe quand je cours le code ci-dessus

1 - quand je passe & bien dans ma fonction de poussée pour la pile si je ne le passe pas comme une adresse (&) j'obtiens une erreur de segmentation après que j'aie entré ma chaîne et ai frappé entrer. Si je laisse le & il passera et poussera les nouvelles données dans la pile.

2- Problème lorsque je demande à une deuxième chaîne d'entrer dans la pile, elle modifie les données du noeud précédent et du noeud de la pile.

Logiquement, je passe la même adresse à la pile de sorte que les données du noeud pointent naturellement vers toutes les nouvelles données qui ont été données à bien. Mais si je ne le passe pas comme une adresse, j'obtiens une erreur de segmentation. 11

Désolé pour les questions noob mais j'ai passé quelques jours maintenant depuis que j'ai commencé à chercher des forums et des vidéos youtube. L'écrire sur le papier et etc.

+1

'scanf ("% s ", & entrée);' est faux. – BLUEPIXY

+2

Vous devez allouer de l'espace pour 'input' avant de pouvoir y scanner quoi que ce soit. – Barmar

+0

'pTop -> stro typo as' pTop -> type' – BLUEPIXY

Répondre

-1
char* getChar(string prompt) 
{ 
    #define BUFFER_LEN (32) 
    char buffer[BUFFER_LEN + 1] = {0}; // keep a space for '\0' 
    int inputlen = 0; 
    char *input; 
    printf(" %s", prompt); 
    scanf(" %32s", buffer); 
    inputlen = strlen(buffer); 
    input = malloc(inputlen + 1); 
    // assert input != NULL 
    memset(input, 0, inputlen + 1); 
    strcpy(input, buffer); 
    return input; 
} 
+0

Pourquoi le memset()? strcpy() écrit une chaîne terminée par un caractère nul. – torstenvl