首頁 >後端開發 >C++ >如何正確使用strtol將字串轉換為長整數並處理潛在的錯誤?

如何正確使用strtol將字串轉換為長整數並處理潛在的錯誤?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-12-25 17:31:14801瀏覽

How Can I Correctly Use strtol to Convert Strings to Long Integers and Handle Potential Errors?

strtol 的正確用法

strtol 函數將長整數的字串表示形式轉換為長值。但是,在使用此函數時,了解如何正確處理錯誤至關重要。

在給定的程式碼中,由於錯誤的假設而出現了問題。該程式碼依賴於這樣一個事實:如果 strtol 成功轉換字串,則第二個參數應等於 NULL。然而,這個假設並不總是成立。

為了有效地偵測strtol 的錯誤,有必要遵循正確的錯誤處理準則:

  • 將errno 設定為0在呼叫strtol 之前: 標準函式庫函數不會將errno 設為0,因此應在每次strtol先前手動將其設為零call.
  • 根據 str 和 *temp != ' ' 檢查 temp : 當主題序列為空或不具有預期形式時,會發生錯誤情況。這由 temp == str 或主題序列後的任何無法辨識的字元表示,由 *temp != ' ' 檢查。
  • 處理值超出可表示範圍:如果轉換後的值超出了 long 的可表示範圍,strtol 傳回 LONG_MIN、LONG_MAX,或將 errno 設為 ERANGE。應該檢查這一點以確保正確處理此類錯誤。

這是遵循以下原則的parseLong 函數的修訂版本:

static long parseLong(const char *str)
{
    errno = 0;
    char *temp;
    long val = strtol(str, &temp, 0);

    if (temp == str || *temp != '<pre class="brush:php;toolbar:false">bool parseLong(const char *str, long *val)
{
    errno = 0;
    char *temp;
    *val = strtol(str, &temp, 0);

    if (temp == str || *temp != '' ||
        ((*val == LONG_MIN || *val == LONG_MAX) &amp;&amp; errno == ERANGE)) {
        return false;
    }

    return true;
}
' || ((val == LONG_MIN || val == LONG_MAX) && errno == ERANGE)) { fprintf(stderr, "Could not convert '%s' to long and leftover string is: '%s'\n", str, temp); return 0; // or LONG_MIN/LONG_MAX if needed } return val; }

或者,單獨的錯誤處理從轉換結果來看,可以使用修改後的介面:

以上是如何正確使用strtol將字串轉換為長整數並處理潛在的錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn