通过将char * in推入堆栈来编码C.

时间:2017-06-08 00:08:10

标签: c stack

好的,我现在已经花了大约一天半的时间研究这段代码,并且发现我已经弄明白为什么它不起作用了。

1 - 说我将参数传递给参数(但执行正常)

2 - 仅将char*的第一个字母推送到堆栈而不是整个字符串

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

好的,我上面的代码工作了一些......我知道我有一个内存/指针问题,我很难找到我正在尝试做的相关文档,因为它涉及传递一个char *在C中,当我运行上面的代码

时会发生这种情况

1 - 如果我没有将它作为地址(&amp;)传递给我的堆栈推送功能,那么当我输入我的字符串并按回车键后,我会收到分段错误。如果我离开&amp;它将传递并将新数据推入堆栈。

2-当我要求第二个字符串插入堆栈时,它会更改前一个节点和堆栈中节点的数据。

逻辑上我正在将相同的地址传递给堆栈,因此节点的数据自然会指向新数据所带来的好处。但如果我没有将其作为地址传递,我会得到分段错误11

对于noob问题很抱歉,但是我已经花了几天时间才开始通过论坛和youtube视频进行挖掘。把它写在纸上等等。

1 个答案:

答案 0 :(得分:-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;
}