0

我正在尝试将堆栈转换为字符串。我的功能是

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

我希望我的堆栈看起来像

  • 堆栈[STACK_MEMORY_ADDRESS]:
  • ELEMENT_NUMBER:数据...
  • ELEMENT_NUMBER:数据

如果结果中有足够的空间,字符串应该存储在那里,我想返回一个“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++){
    ???
}
}

任何人都可以就我接下来应该做什么提供任何建议吗?我想我需要做一个冲刺,并将堆栈中的剩余元素与结果大小进行比较,并在某些情况下返回,但我不确定如何实现它......

4

1 回答 1

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;
}
于 2013-05-09T06:32:06.730 回答