首頁 > 後端開發 > C++ > 在C和C中使用strtol時如何正確處理錯誤?

在C和C中使用strtol時如何正確處理錯誤?

Barbara Streisand
發布: 2024-12-25 15:35:09
原創
866 人瀏覽過

How Can I Properly Handle Errors When Using strtol in C and C  ?

正確使用strtol 進行錯誤處理

以下C 或C 程式將字串轉換為長整數,依賴於strtol 傳回的事實NULL表示成功轉換。但是,當給定值 55 時,它會失敗並顯示以下訊息:

./convertToLong 55
Could not convert 55 to long and leftover string is: 55 as long is 55
登入後複製

本文探討瞭如何正確檢測 strtol 中的錯誤並解決給定程式中的問題。

strtol 中的錯誤處理

strtol(以及strtoll 等相關函數)的官方規範指出即:

  • 它將輸入字元串分成三部分:空格、主題(整數)和無法辨識的字元。
  • 如果主題為空或無效,則不會發生轉換,並且endptr 指向輸入字串的開頭。
  • 如果轉換後的值超出可表示範圍,則傳回適當的最小值或最大值(例如,LONG_MIN 或 LONG_MAX),並且 errno 設定為 ERANGE。

修正程式

在 C 中,可以透過設定來偵測來自 strtol 的錯誤在呼叫函數之前將 errno 設為零。下面修改後的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)
{
    char *temp;
    bool rc = true;
    errno = 0;
    *val = strtol(str, &amp;temp, 0);

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

    return rc;
}
登入後複製
' || ((val == LONG_MIN || val == LONG_MAX) && errno == ERANGE)) fprintf(stderr, "Could not convert '%s' to long and leftover string is: '%s'\n", str, temp); // cerr << "Could not convert '" << str << "' to long and leftover string is '" // << temp << "'\n"; return val; }
  • 如果輸入為空、無效或有尾隨字符,則會向stderr 打印錯誤,如果錯誤則返回0 或LONG_MIN/LONG_MAX由於範圍溢出。
  • 如果沒有錯誤,則回傳轉換後的

在 C中,更靈活的方法是返回成功/失敗指示符,並提供一個單獨的函數來提取轉換後的值:

結論

通過這些修改,parseLong 函數可以正確處理來自strtol 的錯誤,從而允許應用程式確定成功或轉換失敗並適當處理錯誤。

以上是在C和C中使用strtol時如何正確處理錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板