2010-05-11 59 views
4

即 -如何防止字符指針緩衝區溢出?

int function(char* txt) 
{ 
    sprintf(txt, "select * from %s;", table); 
    //How do I set last char in buffer to NULL here? 
} 

因此,如果在表中的文本一些如何被500個字符在主長和txt

由於只定義爲100 ....。

+11

我希望表中的文本不會來自Bobby表 – 2010-05-11 01:01:54

+3

NUL是'\ 0'字符,NULL是未初始化的指針。 – detly 2010-05-11 01:07:15

回答

11

您需要

  • 添加參數,使該緩衝
  • 使用snprintf()代替sprintf()
  • 檢查snprintf()的返回值來緩衝多大需要的大小的功能要保存所有格式化的數據;如果它大於或等於緩衝區的大小,則應該按照您認爲合適的方式處理它(緩衝區仍然以null結尾,但內容將被截斷以適合;無論這是否正確或者錯誤完全取決於您的使用情況)

(和你的函數需要返回類型...)

+0

謝謝,我不確定是否有其他方法。 – 2010-05-11 00:55:37

3

您應該能夠使用的snprintf限制所使用的緩衝液的量。

function(char* txt, size_t length) 
{ 
    int rv; 
    rv = snprintf(txt, length, "select * from %s;", table); 
    //How do I set last char in buffer to NULL here? 
    if (rv >= length) { 
     // error 
    } 
} 
+1

你確實需要檢查'snprintf()'的返回值,儘管如此 - 在大小寫明顯是需要處理的錯誤的情況下。 – caf 2010-05-11 01:05:28

+0

@caf謝謝;更新。 – WhirlWind 2010-05-11 01:11:06

0

關於你能做的唯一的事情就是的malloc足夠的內存,格式化串入內存,並返回一個指向它。然後,調用函數將負責釋放內存。

+0

你可以做的比這更多。 – WhirlWind 2010-05-11 01:12:29