在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-hant/n/301016.html
微信掃一掃
支付寶掃一掃