2013-05-09 3 views
0

Я пытаюсь преобразовать стек в строку. Функция у меня естьПреобразование стека в строку

int StackToString(const struct Stack *stack, char *result, int resultSize); 

Я хочу, чтобы мой стек выглядеть

  • стек [STACK_MEMORY_ADDRESS]:
  • Element_number: DATA ...
  • Element_number: DATA

Если в результате достаточно места, строка должна быть сохранена там, и я хочу вернуться с помощью «1 " стоимость. Если нет (продиктовано resultSize), мы возвращаем 0 и результат не определен.

До сих пор, это то, что я написал:

int StackToString(const struct Stack *stack, char *result, int resultSize){ 
    int i; 
    char str[20]; 
    sprintf(str, "stack[0x%x]:\n", stack); 
    strcat(result, str); 
    for(i=0; i<stack->currentItemIndex;i++){ 
    ??? 
} 
} 

Может кто-нибудь предложить какие-либо советы о том, что я должен делать дальше? Я думаю, что мне нужно сделать спринт с чем-то и сравнить оставшиеся элементы в стеке с результатами и вернуться под определенные, но я не уверен, как его реализовать ....

+0

'sprintf' в str и' strcat', чтобы результат, как вы уже делаете, только в цикле? Это звучит как правильная идея. – Patashu

+0

Какие данные хранятся в 'stack'? –

+0

Вам разрешено уничтожить стек? Обеспечивает ли стек доступ к внутренним элементам? Если нет, вам, скорее всего, нужно будет вытаскивать предметы из одного стека, преобразовывать их в строку и выталкивать элемент в другой стек. Когда исходный стек пуст, вы можете перезагрузить элементы, выталкиваемые из второго стека - упорядочение отлично работает. –

ответ

1

Если вы можете использовать snprintf() вместо sprintf() вы можете избавиться от промежуточного буфера и дополнительного копирования. Также это гарантирует, что ваш буфер результатов не будет перезаписан.

int StackToString(const struct Stack *stack, char *result, int resultSize) { 
    int i; 
    int n; 
    n = snprintf(result, resultSize, "stack[0x%x]:\n", stack); 
    if (n < 0 || n >= resultSize) 
     return 0; 
    result += n; 
    resultSize -= n; 
    for (i = 0; i < stack->currentItemIndex; i++) { 
     n = snprintf(result, resultSize, "%d: 0x%x\n", i, stack->items[i]); 
     if (n < 0 || n >= resultSize) 
      return 0; 
     result += n; 
     resultSize -= n; 
    } 
    return 1; 
}