Стек возвращает целочисленное значение вместо строки / символов. Как я могу это исправить? - PullRequest
0 голосов
/ 30 апреля 2019

Я создаю стек, и я не могу получить вывод в формате строки.Это моя первая попытка использования стека, и каждый пример, который я нахожу, направлен на значения int из структур вместо значений char.

Я пытался привести int к символам, но не думаю, чтоэто фактическое целочисленное значение строк (так как они изменяются с одной и той же строкой).Я предполагаю, что он указывает на область памяти?

typedef struct carList 
{   
    char input[12];
    char make[12];
    char model[12];
    char size[12];
    char color[12];
    char power[12];
    float daily_rate;
    char rented;    
    struct carList *next;
}

typedef struct carList StackNode;
typedef StackNode *StackNodePtr;

void push(StackNodePtr *topPtr, char input) {
    StackNodePtr newPtr = malloc(sizeof(StackNode));

    if(newPtr != NULL) {

        newPtr->make[12] = input;
        newPtr->next = *topPtr;
        *topPtr = newPtr;
    } else {
        printf("Not inserted.");
    }
}

int pop(StackNodePtr *topPtr) {
    StackNodePtr tempPtr = *topPtr;
    int popValue = (*topPtr)->make[12];
    *topPtr = (*topPtr)->next;
    free(tempPtr);
    return popValue;
}

void printStack(StackNodePtr currentPtr) {
    if(currentPtr == NULL) {
        puts("The stack is empty.");
    } else {
        puts("The stack is:");

        while(currentPtr != NULL) {
            printf("%s --> ", currentPtr->make);
            currentPtr = currentPtr->next;
        }
        puts("NULL\n");
    }
}

int main() 
{
   StackNodePtr stackPtr = NULL;

   push(&stackPtr, "Test");
   push(&stackPtr, "test");
   push(&stackPtr, "Test");
   printStack(stackPtr);
} 

Я хотел бы распечатать это:

The stack is:
Test --> test --> Test --> NULL

Но вместо этого я получаю

The stack is:
 -->  --> -->NULL

Когда я изменяю свою функцию printStack на печать% d вместо этого, я получаю

The stack is:
12653804 --> 12653692 --> 12653580 -->NULL

Из-за этого я предполагаю, что это связано в основном с моей функцией печати, но я изо всех сил пытаюсьпонимаю почему.

1 Ответ

0 голосов
/ 30 апреля 2019

Прежде чем я перейду к функции push, обратите внимание, что ваше определение структуры должно заканчиваться точкой с запятой.Код не скомпилируется, пока вы его не установите.Также хорошо добавить спецификатор класса хранения в объявлении.

typedef struct carList 
{   
    char input[12];
    char make[12];
    char model[12];
    char size[12];
    char color[12];
    char power[12];
    float daily_rate;
    char rented;    
    struct carList *next;
}carList;

Что касается вашего вопроса, функция печати не является проблемой;Это ваша функция толчка!Прямо сейчас вы просто присваиваете позиции [12] в массиве первый символ строки.Проверьте это:

newPtr->make[12] = input;

Мы должны скопировать строку в newPtr-> make, используя strcpy.Это можно сделать следующим образом:

strcpy(newPtr->make, input);

Кроме того, объявление вашей функции должно передавать массив символов вместо одного символа.

void push(StackNodePtr *topPtr, char *input)

Соединение этих элементов приводит меня к рабочей версиивашего кода:

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

typedef struct carList 
{   
    char input[12];
    char make[12];
    char model[12];
    char size[12];
    char color[12];
    char power[12];
    float daily_rate;
    char rented;    
    struct carList *next;
}carList;

typedef struct carList StackNode;
typedef StackNode *StackNodePtr;

void push(StackNodePtr *topPtr, char *input) {
    StackNodePtr newPtr = malloc(sizeof(StackNode));

    if(newPtr != NULL) {
        strcpy(newPtr->make, input);
        newPtr->next = *topPtr;
        *topPtr = newPtr;
    } else {
        printf("Not inserted.");
    }
}

int pop(StackNodePtr *topPtr) {
    StackNodePtr tempPtr = *topPtr;
    int popValue = (*topPtr)->make[12];
    *topPtr = (*topPtr)->next;
    free(tempPtr);
    return popValue;
}

void printStack(StackNodePtr currentPtr) {
    if(currentPtr == NULL) {
        puts("The stack is empty.");
    } else {
        puts("The stack is:");

        while(currentPtr != NULL) {
            printf("%s --> ", currentPtr->make);
            currentPtr = currentPtr->next;
        }
        puts("NULL\n");
    }
}

int main() 
{
   StackNodePtr stackPtr = NULL;

   push(&stackPtr, "Test");
   push(&stackPtr, "test");
   push(&stackPtr, "Test");
   printStack(stackPtr);
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...