2017-02-12 1 views
1

Я работаю над назначением структур данных, сосредоточенным на пакетах, и мне нужна помощь. Я должен сравнить две строки, если они являются палиндром, используя стек.Структуры данных: моя программа сработает, когда я пытаюсь вытащить данные из стека

Мое представление об этой программе - fgets() строка. Очистите пробелы и сохраните их в символе «o», затем нажмите каждый символ в стек, вытащите их в другой набор символов «r» и проверьте, есть ли (o == r).

Однако, когда я компилирую, я получаю предупреждение, которое программа отлично работает с ним. Далее в мою программу, когда я пытаюсь вытащить свой символ обратно, программа вылетает.

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

Предупреждение:

main.c:28:17: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] 
     dataPtr = (char*)s[c]; 

Что я получаю, когда он выходит из строя:

Segmentation fault (core dumped) 

Мой прилагается Код:

#include <stdio.h> 
#include <stdlib.h> 
#include <stdbool.h> 
#include <string.h> 
#include "stacksADT.h" 

int main (void) 
{ 
    char s[50]; 
    char o[50]; 
    char r[50]; 

    STACK* stack; 
    char* dataPtr; 

    stack = createStack(); 

    printf("Enter the string to compare:\n"); 
    fgets(s,50, stdin); 

    for(int c = 0; c < strlen(s); c++){ 
    if(s[c] != ' '){ 
     dataPtr = (char*)s[c]; 
     printf("%s", dataPtr); 
     pushStack(stack, dataPtr); 
    } 
    } 

    for(int c = 0; c < strlen(o); c++){ 
    printf("%s", (char*)popStack(stack)); 
    } 

} // main 

Мои popStack() операция:

void* popStack (STACK* stack) 
{ 
    // Local Definitions 
    void* dataOutPtr; 
    STACK_NODE* temp; 

    // Statements 
    if(stack->count == 0) 
    dataOutPtr = NULL; 
    else 
    { 
    temp = stack->top; 
    dataOutPtr = stack->top->dataPtr; 
    stack->top = stack->top->link; 
    free(temp); 
    (stack->count)--; 
    } // else 
    return dataOutPtr; 
} // popStack 
+1

не игнорировать предупреждение: 'DataPtr = (символ *) s [с];' неправильно. Это должно быть 'dataPtr = s + c;' –

+0

попытаться прокомментировать (temp) и выполнить, что случилось? – Aubin

+1

Здесь 'dataPtr = (char *) s [c];' удаляет бросок и исправляет код. Присвоение значению символа 'char' (' s [c] ') указателю (' dataPtr') не имеет никакого смысла. – alk

ответ

3

s[c] возвращает символ. Вы просто бросаете его на указатель. Присвоение указателю char *dataPtr неверно, вам нужно передать ему ссылку. Используйте любой из этих двух:

  • dataPtr = &(s[c])
  • dataPtr = s+c
+0

Так что у меня создалось впечатление, что' & (s [c]) 'указывает на адрес определенного символа, такого как массив. Но я, кажется, получаю все после этого символа Например, «Go Dog» с '& (s [2])' дает мне «собаку». Мне просто нужно вернуть одну букву. Правильно ли мое предположение? Если да, то как бы я изменил его, чтобы получить только один символ. – TheXales

+0

Ваше мнение верное. Чтобы получить i-й символ в строке длины l, просто, сделайте s [i-1] – Pbd

Смежные вопросы