在C/C++程序中,有時需要將字元串轉換成長整型數值,例如在讀取文件或者網路傳輸中。其中,C標準庫提供了strtoll函數來完成這個轉換過程。在本文中,我們將明確strtoll函數的定義和作用,並在此基礎上進行多方面的講解。
一、strtoll函數的定義和作用
strtoll函數用於將字元串轉換為長整型數值。函數的聲明如下:
long long strtoll(const char *str, char **endptr, int base);
str參數是要轉換的字元串,endptr參數是一個指針,指向轉換後string中第一個非數字字元的位置。base參數表示轉換時使用的進位數,取值範圍是2~36。如果base為0,則表示通過前綴確定進位數,如0x表示十六進位,0表示八進位,其他情況默認為十進位。
函數返迴轉換後的長整型數值。如果轉換失敗,返回0。
二、使用strtoll函數轉換字元串
為了演示如何使用strtoll函數來轉換字元串,下面的例子將展示如何將字元串”1234567890123456789″轉換為長整型數值。
#include #include int main() { char str[] = "1234567890123456789"; char *endptr; long long val; val = strtoll(str, &endptr, 10); printf("字元串%s轉換成長整型數值為%lld,下一個字元為%c。\n", str, val, *endptr); return 0; }
輸出結果為:字元串1234567890123456789轉換成長整型數值為1234567890123456789,下一個字元為\0。
可以看出,在轉換過程中,strtoll函數將字元串轉換成了對應的長整型數值,並通過endptr參數返回了字元串中非數字字元的位置。
三、轉換時的進位數
前面說過,base參數可以指定轉換時使用的進位數,十進位是默認值。下面的例子將展示使用不同進位數進行轉換的結果。
#include #include int main() { char str[] = "101011"; long long val; char *endptr; val = strtoll(str, &endptr, 2); printf("二進位字元串%s轉換成長整型數值為%lld,下一個字元為%c。\n", str, val, *endptr); val = strtoll(str, &endptr, 8); printf("八進位字元串%s轉換成長整型數值為%lld,下一個字元為%c。\n", str, val, *endptr); val = strtoll(str, &endptr, 10); printf("十進位字元串%s轉換成長整型數值為%lld,下一個字元為%c。\n", str, val, *endptr); val = strtoll(str, &endptr, 16); printf("十六進位字元串%s轉換成長整型數值為%lld,下一個字元為%c。\n", str, val, *endptr); return 0; }
輸出結果為:
二進位字元串101011轉換成長整型數值為43,下一個字元為。
八進位字元串101011轉換成長整型數值為2649,下一個字元為。
十進位字元串101011轉換成長整型數值為101011,下一個字元為。
十六進位字元串101011轉換成長整型數值為1052689,下一個字元為。
可以看到,當使用不同進位數進行轉換時,轉換結果和endptr參數的值都不同。
四、結合errno處理錯誤
當轉換失敗時,strtoll函數返回0,並且設置全局變數errno的值來指示發生的錯誤類型。下面的例子將展示如何結合errno變數來處理轉換錯誤。
#include #include #include int main() { char str[] = "123abc45"; errno = 0; long long val = strtoll(str, NULL, 10); if (errno == EINVAL) { printf("無效的基數參數。\n"); } else if (errno == ERANGE) { printf("超出範圍。\n"); } else if (val == 0) { printf("轉換失敗。\n"); } else { printf("轉換成功,數值為%lld。\n", val); } return 0; }
輸出結果為:轉換失敗。
可以看到,在轉換無效的字元串時,可以通過errno變數來判斷具體的錯誤類型,並進行處理。
五、使用strtoll函數進行long long數值溢出檢查
由於long long類型的數值範圍有限,C標準庫提供的strtoll函數在轉換大於long long類型極值的字元串時,不會拋出異常,而是直接返回long long類型的極值。為了避免這種情況出現,我們可以使用strtoull函數進行檢查。下面的例子展示如何使用strtoull函數進行long long數值溢出檢查。
#include #include int main() { char str[] = "9223372036854775809"; char *endptr; unsigned long long ullval = strtoull(str, &endptr, 10); long long val; if (ullval == ULLONG_MAX && errno == ERANGE) { printf("字元串轉換long long型數值溢出。\n"); return -1; } else { val = (long long)ullval; printf("字元串%s轉換成long long型數值為%lld。\n", str, val); } return 0; }
輸出結果為:字元串9223372036854775809轉換成long long型數值溢出。
可以看到,在字元串超出long long類型範圍時,使用strtoull函數可以及時地進行檢測並處理。
六、結語
本文主要介紹了如何使用strtoll函數將字元串轉換為長整型數值。在使用時,應注意轉換進位和錯誤處理等細節,以確保程序的正確性和可靠性。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/301016.html