簡體   English   中英

3位數字的緩沖區

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM