[英]Buffer for a 3 digit number
我想為3位數字,狀態和空字符創建一個緩沖區。 目前我有
char buf[4];
sprintf(buf, "%d",status);
我的問題是,這對於3位數字是否足夠大,它是從waitpid()作為狀態返回的
是的,但是沒有什么可以防止用戶(或status
被填充)輸入超過三位數並溢出該小緩沖區。
應該改用snprintf
函數,它將切斷過長的輸入:
snprintf(buf, 4, "%d", status); // the 4 is the length of buf
是:3個字符/數字,后跟null。
安全要比后悔好。
如果您希望安全,請確保它確實是3位數字。
例如,您可以使用mod運算符:
char buf[4];
sprintf(buf, "%d",status % 1000);
請注意,如果您選擇snprintf
解決方案,並給出1001,則結果為100;如果使用此解決方案,則結果為1。
您可以選擇更適合您的。
您也可以將兩者結合起來:
snprintf(buf, sizeof(buf), "%d",status % 1000);
嚴格地使用三位數的十進制是安全的,但是waitpid()
並沒有這樣的保證; pid_t
類型是一個32位有符號整數,而三位數字似乎有些樂觀。 ÿ
您應該檢查waitpid()
返回值的范圍,以確保它適合您的緩沖區,但是通常不必如此,以節省內存。 一個12個字符的緩沖區將允許將任何32位帶符號整數表示為十進制字符串(最壞的情況是10位數字,一個符號字符和一個nul終止符)。 同樣,對於16位,請使用7位,而對於64位請使用23。
decimal_string_buffer_len = ceil(log(2 sizeof(type)* CHAR_BIT ))+ 3
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.