2013-05-09 86 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; 
}