分析strtol(),strtoul()和strtod()三個函數的功能

字符串轉換為數值部分和子字符串首地址的函數有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;

}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/81791.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/81791.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/81791.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Spring 的事務隔離

在Spring框架中,事務管理是一個非常重要的方面,它允許開發者以聲明式的方式定義事務邊界,并且通過配置不同的隔離級別來控制并發事務的行為。Spring支持多種事務管理方式,包括編程式事務管理和聲明式事務管理(如使用Tr…

單片機自動排列上料控制程序

/****L2233 CODE11549 2025 4 18 08:53*******/ /***軸承上料機控制 提升 搖擺 光電檢測***/ /***2025 3 21 電機控制PCB板 PAST ***/ /*2.3 2.2 1.2 1.3 1.4 1.5 1.6 1.7 5.3 3.2 ***/ /*啟動 解鎖 光電 接近 前停 后停 電機前 電機后*/ #include &quo…

力扣119題解

記錄 2025.5.5 題目&#xff1a; 思路&#xff1a; 代碼: class Solution {public List<Integer> getRow(int rowIndex) {List<Integer> row new ArrayList<Integer>();row.add(1);for (int i 1; i < rowIndex; i) {row.add((int) ((long) row.get(i…

國產化海光C86架構服務器安裝windows實錄

最近幾年與紅藍關系急轉直下&#xff0c;尤其是科技領域尤為突出。隨之而來的就是軟硬件的國產化大潮。由于行業的原因根據要求必須使用國產化服務器、國產化操作系統、國產化數據庫、國產化中間件。雖然閉關鎖國斷開紅藍聯系可以在一定程度激發國產化發展&#xff0c;但是不得…

Oracle OCP證書有效期是三年?

這一段時間&#xff0c;網上經常傳出消息Oracle OCM認證證書有效期為三年&#xff0c;其實這個假消息&#xff0c;通過博睿谷與Oracle官方人員確認&#xff0c;OCP認證證書有效期是永久的。 OCP證書本身永久有效&#xff0c;但老版本的OCP證書代表著更多的項目經驗&#xff0c…

Python 閉包:函數式編程中的魔法變量容器

閉包與匿名函數的常見混淆 在編程社區中&#xff0c;閉包(closure)和匿名函數(anonymous function)經常被混為一談&#xff0c;這種混淆有其歷史根源&#xff1a; 歷史發展因素&#xff1a;在早期編程實踐中&#xff0c;在函數內部定義函數并不常見&#xff0c;直到匿名函數廣…

迅睿CMS導入別站數據庫

<?php if (isset($_GET[go])) {$host localhost;// 數據庫服務器$username uname;// 數據庫用戶名$password pwd;// 數據庫密碼$database database;// 數據庫名$cmscid $_GET[cmscid];$mtabcid $_GET[mtabcid];if ($_GET[go] step1) {//第一步&#xff1a;先獲取CMS…

基于C++、JsonCpp、Muduo庫實現的分布式RPC通信框架

??個人主頁&#xff1a;小羊 ??所屬專欄&#xff1a;項目 很榮幸您能閱讀我的文章&#xff0c;誠請評論指點&#xff0c;歡迎歡迎 ~ 目錄 項目介紹JsonCpp庫簡單介紹Muduo庫簡單介紹C11異步操作——std::future1. 使用 std::async 關聯異步任務2. std::packaged_task 配…

EPSG:3857 和 EPSG:4326 的區別

EPSG:3857 和 EPSG:4326 是兩種常用的空間參考系統&#xff0c;主要區別在于坐標表示方式和應用場景。以下是它們的核心差異&#xff1a; 1. 坐標系類型 EPSG:4326&#xff08;WGS84&#xff09; 地理坐標系&#xff08;Geographic Coordinate System&#xff09;&#xff0c;基…

Docker 使用與部署(超詳細)

目錄 引入 入門使用 部署對比 鏡像倉庫 命令解釋 基礎 常見命令 示例 數據卷的使用 數據卷的概念 數據卷的使用 掛載本地目錄文件 鏡像 結構 Dockerfile 容器網絡 部署 DockerCompose 語法 ?編輯 基礎命令 引入 當我們在 Linux 上部署一個集成了很多中間件…

JAVA在線考試系統考試管理題庫管理成績查詢重復考試學生管理教師管理源碼

一、源碼描述 這是一套在線考試源碼&#xff0c;基于SpringBootVue框架&#xff0c;后端采用JAVA語言&#xff0c;可以用于重復考試&#xff0c;一、管理員功能&#xff1a;1、考試管理&#xff1a;包括考試查詢與添加考試功能&#xff0c;2、題庫管理&#xff1a;管理所有題庫…

在Qt Creator中使用CUDA

要在Qt Creator項目中使用CUDA進行GPU加速計算&#xff0c;你需要進行一些配置。以下是詳細步驟&#xff1a; 1. 安裝必要軟件 安裝最新版本的NVIDIA CUDA Toolkit 確保已安裝Qt Creator和兼容的編譯器(如MSVC或GCC) 2. 創建Qt項目 打開Qt Creator&#xff0c;創建一個新的…

qml顯示視頻幀(QQuickImageProvider)

一、實現方式 解碼視頻可以選擇:opencv、ffmpeg等。 顯示視頻可以選擇:Qt Multimedia、QQuickImageProvider、ShaderEffect、自定義QQuickItem等。 本文使用opencv解碼視頻,QQuickImageProvider顯示視頻。 二、QQuickImageProvider 中,requestImage 和 requestTexture區…

深度實時美顏:Deep-Live-Cam

深度實時美顏:Deep-Live-Cam 在這個數碼化加速的時代,如何用一張圖片,捕捉瞬間,將虛擬與現實無縫融合在一起?Deep-Live-Cam給出了驚人的答案。這個應用程序不僅實現了實時臉部替換和一鍵視頻深度偽裝,還通過一張圖片完成了這些操作,其獨特的技術讓人在視頻通話和直播中…

OPENGLPG第九版學習 -視口變換、裁減、剪切與反饋

文章目錄 5.1 觀察視圖5.1.1 視圖模型—相機模型OpenGL的整個處理過程中所用到的坐標系統&#xff1a;視錐體視錐體的剪切 5.1.2 視圖模型--正交視圖模型 5.2 用戶變換5.2.1 矩陣乘法的回顧5.2.2 齊次坐標5.2.3 線性變換與矩陣SRT透視投影正交投影 5.2.4 法線變換逐像素計算法向…

卷積神經網絡實戰(2)

接上一篇文章&#xff0c;說到模型定義&#xff1a; class CNN(nn.Module):def __init__(self, activation"relu"):super(CNN, self).__init__()self.activation F.relu if activation "relu" else F.selu#輸入通道數&#xff0c;圖片是灰度圖&#xff…

方案精讀:業財融合轉型路徑和華為實踐【附全文閱讀】

在當今快速變化、競爭激烈的時代,業務面臨不確定性,業財融合至關重要。以華為為例,其從財務到財經的轉型,歷經財務四統一變革、IFS 變革等,構建了包含財經能力中心(COE)、業務伙伴(BP)和財經共享中心(SSC)的財務組織架構 。通過實現財務四算拉通、提升預算預測、項目…

GAF-CNN-SSA-LSSVM故障診斷/分類預測,附帶模型研究報告(Matlab)

GAF-CNN-SSA-LSSVM故障診斷/分類預測&#xff0c;附帶模型研究報告&#xff08;Matlab&#xff09; 目錄 GAF-CNN-SSA-LSSVM故障診斷/分類預測&#xff0c;附帶模型研究報告&#xff08;Matlab&#xff09;效果一覽基本描述程序設計參考資料 效果一覽 基本描述 本研究提出的GA…

新型深度神經網絡架構:ENet模型

語義分割技術能夠為圖像中的每個像素分配一個類別標簽&#xff0c;這對于理解圖像內容和在復雜場景中找到目標對象至關重要。在自動駕駛和增強現實等應用中&#xff0c;實時性是一個硬性要求&#xff0c;因此設計能夠快速運行的卷積神經網絡非常關鍵。 盡管深度卷積神經網絡&am…

基于DGI框架的最佳實踐

基于DGI框架的核心邏輯和搜索結果中的實踐案例&#xff0c;以下是最精簡的5步實施路徑推薦&#xff1a; 1. 明確治理目標與范圍&#xff08;Why & What&#xff09; 聚焦核心問題&#xff1a;優先選擇1-2個業務痛點&#xff08;如數據質量低下、主數據混亂、合規風險&…