字符串轉換為數值部分和子字符串首地址的函數有strtol(),strtoul()和strtod()三個函數。
1、strtol()函數
long int?strtol(const char *str, char **endptr, int base)
//當base=0時,若字符串不是以"0","0x"和"0X"開頭,則將數字部分按照10進制轉換
//當base=0時,若字符串是以"0"開頭,則將數字部分按照8進制進制轉換
//當base=0時,若字符串是以"0x"和"0X"開頭,則將數字部分按照16進制進轉換
//當base=10時,字符串將字符串視為十進制字符串,則將數字部分按照10進制轉換
//當base=2時,字符串將字符串視為2進制字符串,則將數字部分按照2進制轉換
//當base=16時,字符串將字符串視為16進制字符串,則將數字部分按照16進制轉換
//當base=8時,字符串將字符串視為8進制字符串,則將數字部分按照8進制轉換
void?Test_strtol(void)
{
char?buf[15];//聲明char型數組buf[]
int?retValue;//聲明int型變量(有符號32位)
char?*p;//聲明char型數組SubStringBuf[]
strcpy(buf,"+10GHIJ");
retValue=strtol(buf,&p,0);
//當base=0時,若字符串不是以"0","0x"和"0X"開頭,則將其視為十進制
//將"字符串的數字部分"轉換為數值返回,保存到retValue中
//同時將"非數字部分的首地址"返回,保存到p
//retValue=10,p指向"GHIJ"
printf("Value=%d\r\n",retValue);//串口輸出Value=10
if(p)printf("SubString=%s\r\n",p);//串口輸出"SubString=GHIJ"
else printf("No SubString\r\n");
strcpy(buf,"-1EFGH");
retValue=strtol(buf,&p,0);
//當base=0時,若字符串不是以"0","0x"和"0X"開頭,則將其視為十進制
//將"字符串的數字部分"轉換為數值返回,保存到retValue中
//同時將"非數字部分的首地址"返回,保存到p
//retValue=-1,p指向"EFGH"
printf("Value=%d\r\n",retValue);//串口輸出Value=-1
if(p)printf("SubString=%s\r\n",p);//串口輸出"SubString=EFGH"
else?printf("No SubString\r\n");
strcpy(buf,"0x10GHIJ");
retValue=strtol(buf,&p,0);
//當base=0時,若字符串以"0x"或"0X"開頭,則將其視為十六進制
//將"字符串的數字部分"轉換為數值返回,保存到retValue中
//同時將"非數字部分的首地址"返回,保存到p
//retValue=0x10,p指向"GHIJ"
printf("Value=%d\r\n",retValue);//串口輸出Value=16
if(p)printf("SubString=%s\r\n",p);//串口輸出"SubString=GHIJ"
else?printf("No SubString\r\n");
strcpy(buf,"010GHIJ");
retValue=strtol(buf,&p,0);
//當base=0時,若字符串以"0"開頭,則將其視為八進制
//將"字符串的數字部分"轉換為數值返回,保存到retValue中
//同時將"非數字部分的首地址"返回,保存到p
//retValue=8,p指向"GHIJ"
printf("Value=%d\r\n",retValue);//串口輸出Value=8
if(p)printf("SubString=%s\r\n",p);//串口輸出"SubString=GHIJ"
else?printf("No SubString\r\n");
strcpy(buf,"10GHIJ");
retValue=strtol(buf,&p,10);
//當base=10時,字符串將字符串視為十進制字符串
//將"字符串的數字部分"轉換為數值返回,保存到retValue中
//同時將"非數字部分的首地址"返回,保存到p
//retValue=10,p指向"GHIJ"
printf("Value=%d\r\n",retValue);//串口輸出Value=10
if(p)printf("SubString=%s\r\n",p);//串口輸出"SubString=GHIJ"
else printf("No SubString\r\n");
strcpy(buf,"10GHIJ");
retValue=strtol(buf,&p,2);
//當base=2時,字符串將字符串視為二進制字符串
//將"字符串的數字部分"轉換為數值返回,保存到retValue中
//同時將"非數字部分的首地址"返回,保存到p
//retValue=2,p指向"GHIJ"
printf("Value=%d\r\n",retValue);//串口輸出Value=2
if(p)printf("SubString=%s\r\n",p);//串口輸出"SubString=GHIJ"
else printf("No SubString\r\n");
strcpy(buf,"10GHIJ");
retValue=strtol(buf,&p,16);
//當base=2時,字符串將字符串視為16進制字符串
//將"字符串的數字部分"轉換為數值返回,保存到retValue中
//同時將"非數字部分的首地址"返回,保存到p
//retValue=16,p指向"GHIJ"
printf("Value=%d\r\n",retValue);//串口輸出Value=16
if(p)printf("SubString=%s\r\n",p);//串口輸出"SubString=GHIJ"
else?printf("No SubString\r\n");
strcpy(buf,"10GHIJ");
retValue=strtol(buf,&p,8);
//當base=2時,字符串將字符串視為8進制字符串
//將"字符串的數字部分"轉換為數值返回,保存到retValue中
//同時將"非數字部分的首地址"返回,保存到p
//retValue=8,p指向"GHIJ"
printf("Value=%d\r\n",retValue);//串口輸出Value=8
if(p)printf("SubString=%s\r\n",p);//串口輸出"SubString=GHIJ"
else?printf("No SubString\r\n");
retValue=0;
}
2、strtoul()函數
unsigned long int?strtoul(const char?*str, char?**endptr, int?base)
//當base=0時,若字符串不是以"0","0x"和"0X"開頭,則將數字部分按照10進制轉換
//當base=0時,若字符串是以"0"開頭,則將數字部分按照8進制進制轉換
//當base=0時,若字符串是以"0x"和"0X"開頭,則將數字部分按照16進制進轉換
//當base=10時,字符串將字符串視為十進制字符串,則將數字部分按照10進制轉換
//當base=2時,字符串將字符串視為2進制字符串,則將數字部分按照2進制轉換
//當base=16時,字符串將字符串視為16進制字符串,則將數字部分按照16進制轉換
//當base=8時,字符串將字符串視為8進制字符串,則將數字部分按照8進制轉換
#include?"string.h" //strcpy()需要包含string.h頭文件
#include?"stdlib.h" //strtol()和strtoul()需要包含stdlib.h頭文件
void?Test_strtoul(void)
{
char?buf[15];//聲明char型數組buf[]
uint32_t retValue;//聲明uint32_t型變量(有符號32位)
char?*p;//聲明char型數組SubStringBuf[]
strcpy(buf,"+10GHIJ");
retValue=strtoul(buf,&p,0);
//當base=0時,若字符串不是以"0","0x"和"0X"開頭,則將其視為十進制
//將"字符串的數字部分"轉換為數值返回,保存到retValue中
//同時將"非數字部分的首地址"返回,保存到p
//retValue=10,p指向"GHIJ"
printf("Value=%u\r\n",retValue);//串口輸出Value=10
if(p)printf("SubString=%s\r\n",p);//串口輸出"SubString=GHIJ"
else?printf("No SubString\r\n");
strcpy(buf,"-1EFGH");
retValue=strtoul(buf,&p,0);
//當base=0時,若字符串不是以"0","0x"和"0X"開頭,則將其視為十進制
//將"字符串的數字部分"轉換為數值返回,保存到retValue中
//同時將"非數字部分的首地址"返回,保存到p
//retValue=-1,p指向"EFGH"
printf("Value=%u\r\n",retValue);//串口輸出Value=-1
if(p)printf("SubString=%s\r\n",p);//串口輸出"SubString=EFGH"
else?printf("No SubString\r\n");
strcpy(buf,"0x10GHIJ");
retValue=strtoul(buf,&p,0);
//當base=0時,若字符串以"0x"或"0X"開頭,則將其視為十六進制
//將"字符串的數字部分"轉換為數值返回,保存到retValue中
//同時將"非數字部分的首地址"返回,保存到p
//retValue=0x10,p指向"GHIJ"
printf("Value=%u\r\n",retValue);//串口輸出Value=16
if(p)printf("SubString=%s\r\n",p);//串口輸出"SubString=GHIJ"
else?printf("No SubString\r\n");
strcpy(buf,"010GHIJ");
retValue=strtoul(buf,&p,0);
//當base=0時,若字符串以"0"開頭,則將其視為八進制
//將"字符串的數字部分"轉換為數值返回,保存到retValue中
//同時將"非數字部分的首地址"返回,保存到p
//retValue=8,p指向"GHIJ"
printf("Value=%u\r\n",retValue);//串口輸出Value=8
if(p)printf("SubString=%s\r\n",p);//串口輸出"SubString=GHIJ"
else?printf("No SubString\r\n");
strcpy(buf,"10GHIJ");
retValue=strtoul(buf,&p,10);
//當base=10時,字符串將字符串視為十進制字符串
//將"字符串的數字部分"轉換為數值返回,保存到retValue中
//同時將"非數字部分的首地址"返回,保存到p
//retValue=10,p指向"GHIJ"
printf("Value=%u\r\n",retValue);//串口輸出Value=10
if(p)printf("SubString=%s\r\n",p);//串口輸出"SubString=GHIJ"
else?printf("No SubString\r\n");
strcpy(buf,"10GHIJ");
retValue=strtoul(buf,&p,2);
//當base=2時,字符串將字符串視為二進制字符串
//將"字符串的數字部分"轉換為數值返回,保存到retValue中
//同時將"非數字部分的首地址"返回,保存到p
//retValue=2,p指向"GHIJ"
printf("Value=%u\r\n",retValue);//串口輸出Value=2
if(p)printf("SubString=%s\r\n",p);//串口輸出"SubString=GHIJ"
else?printf("No SubString\r\n");
strcpy(buf,"10GHIJ");
retValue=strtoul(buf,&p,16);
//當base=2時,字符串將字符串視為16進制字符串
//將"字符串的數字部分"轉換為數值返回,保存到retValue中
//同時將"非數字部分的首地址"返回,保存到p
//retValue=16,p指向"GHIJ"
printf("Value=%u\r\n",retValue);//串口輸出Value=16
if(p)printf("SubString=%s\r\n",p);//串口輸出"SubString=GHIJ"
else?printf("No SubString\r\n");
strcpy(buf,"10GHIJ");
retValue=strtoul(buf,&p,8);
//當base=2時,字符串將字符串視為8進制字符串
//將"字符串的數字部分"轉換為數值返回,保存到retValue中
//同時將"非數字部分的首地址"返回,保存到p
//retValue=8,p指向"GHIJ"
printf("Value=%u\r\n",retValue);//串口輸出Value=8
if(p)printf("SubString=%s\r\n",p);//串口輸出"SubString=GHIJ"
else?printf("No SubString\r\n");
retValue=0;
}
測試strtol()和strtoul()不同之處
當將“保存的返回值retValue”聲明uint32_t型變量(無符號32位)時,strtoul()和strtol()功能有點點區別,當“字符串的數字部分小于0”時,strtoul()的值為0x100000000+負數,例如字符串“-1”,它會返回retValue=0x100000000-1=0xFFFFFFFF=4294967295。當“字符串的數字部分大于0x7FFFFFFF”時,strtol()的返回值為負數”,例如字符串“0xFFFFFFFF”,它會返回retValue=0xFFFFFFFF=-1。
#include?"string.h" //strcpy()需要包含string.h頭文件
#include?"stdlib.h" //strtol()和strtoul()需要包含stdlib.h頭文件
void?Test_strtol_strtoul(void)
{
char?buf[15];//聲明char型數組buf[]
int?retValue1;//聲明int型變量(有符號32位)
uint32_t retValue2;//聲明uint32_t型變量(無符號32位)
char?*p;//聲明char型指針p
strcpy(buf,"4294967295EFGH");
retValue1=strtol(buf,&p,0);
//當base=0時,若字符串不是以"0","0x"和"0X"開頭,則將其視為十進制
//將"字符串的數字部分"轉換為數值返回,保存到retValue中
//同時將"非數字部分的首地址"返回,保存到p
//retValue1=0x7FFFFFFF,p指向"EFGH"
printf("Value=%d\r\n",retValue1);//串口輸出Value=2147483647
if(p)printf("SubString=%s\r\n",p);//串口輸出"SubString=EFGH"
else?printf("No SubString\r\n");
strcpy(buf,"4294967295EFGH");
retValue2=strtoul(buf,&p,0);
//當base=0時,若字符串不是以"0","0x"和"0X"開頭,則將其視為十進制
//將"字符串的數字部分"轉換為數值返回,保存到retValue中
//同時將"非數字部分的首地址"返回,保存到p
//retValue2=4294967295,p指向"EFGH"
printf("Value=%u\r\n",retValue2);//串口輸出Value=4294967295
if(p)printf("SubString=%s\r\n",p);//串口輸出"SubString=EFGH"
else?printf("No SubString\r\n");
strcpy(buf,"-1EFGH");
retValue1=strtol(buf,&p,0);
//當base=0時,若字符串不是以"0","0x"和"0X"開頭,則將其視為十進制
//將"字符串的數字部分"轉換為數值返回,保存到retValue中
//同時將"非數字部分的首地址"返回,保存到p
//retValue1=-1,p指向"EFGH"
printf("Value=%d\r\n",retValue1);//串口輸出Value=-1
if(p)printf("SubString=%s\r\n",p);//串口輸出"SubString=EFGH"
else?printf("No SubString\r\n");
strcpy(buf,"-1EFGH");
retValue2=strtoul(buf,&p,0);
//當base=0時,若字符串不是以"0","0x"和"0X"開頭,則將其視為十進制
//將"字符串的數字部分"轉換為數值返回,保存到retValue中
//同時將"非數字部分的首地址"返回,保存到p
//retValue2=0x100000000-1=4294967295,p指向"EFGH"
printf("Value=%u\r\n",retValue2);//串口輸出Value=4294967295
if(p)printf("SubString=%s\r\n",p);//串口輸出"SubString=EFGH"
else?printf("No SubString\r\n");
retValue2=0;
}
3、strtod()函數
double?strtod(const char?*str, char?**endptr);
//將"字符串的數字部分"轉換為數值返回,同時將"非數字部分的首地址"返回,保存到endptr
void?Test_strtod(void)
{
char?buf[15];//聲明char型數組buf[]
double?retValue;//聲明double型變量(64位)
char?*p;//聲明char型數組SubStringBuf[]
strcpy(buf,"+10.5GHIJ");
retValue=strtod(buf,&p);
//將"字符串的數字部分"轉換為數值返回,保存到retValue中
//同時將"非數字部分的首地址"返回,保存到p
//retValue=10.5,p指向"GHIJ"
printf("Value=%0.1f\r\n",retValue);//串口輸出Value=10.5
if(p)printf("SubString=%s\r\n",p);//串口輸出"SubString=GHIJ"
else?printf("No SubString\r\n");
strcpy(buf,"-10.5GHIJ");
retValue=strtod(buf,&p);
//將"字符串的數字部分"轉換為數值返回,保存到retValue中
//同時將"非數字部分的首地址"返回,保存到p
//retValue=-10.5,p指向"GHIJ"
printf("Value=%0.1f\r\n",retValue);//串口輸出Value=-10.5
if(p)printf("SubString=%s\r\n",p);//串口輸出"SubString=GHIJ"
else?printf("No SubString\r\n");
retValue=0;
}