2013-05-09 49 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 2013-05-09 05:53:10

+0

你在'stack'中保存了什么样的数据? – 2013-05-09 06:15:48

+0

你被允许销毁堆栈吗?堆栈是否可以访问内部元素?如果没有,你很可能需要从一个堆栈中弹出物品,将它们转换为字符串,然后将物品推入另一个堆栈。当原始堆栈为空时,您可以使用第二个堆栈弹出的项目重新加载 - 排序工作正常。 – 2013-05-09 07:36:35

回答

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