網站首頁 編程語言 正文
一、atoi函數是什么?
int atoi ( const char * str );
功能:將字符串轉換為整數。
解析C字符串str,將其內容解釋為一個整數,該整數作為int值返回。
該函數首先丟棄盡可能多的空白字符,直到找到第一個非空白字符。然后,從這個字符開始,取一個可選的初始加號或減號,后面跟著盡可能多的數字,并將它們解釋為一個數值。 例:" -123456" 轉換為 -123456
字符串可以在構成整數的字符之后包含其他字符,這些字符將被忽略,并且對該函數的行為沒有影響。例:" 123abc456" 轉換為 123,雖然最終的輸出結果是一個整數,但這屬于非法轉換
如果str中的第一個非空白字符序列不是有效的整數,或者由于str為空或只包含空白字符而不存在這樣的序列,則不執行轉換。例:“abc” " abc" “” 為非法轉換,最終會輸出整數0。
字符串 | 整數 | 合法性 |
---|---|---|
" 123456" | 123456 | 合法 |
“-123456” | -123456 | 合法 |
“123abc456” | 123 | 非法 |
“abc” | 0 | 非法 |
“” | 0 | 非法 |
“2222222222” | 任意值 | 非法 |
注:當轉換的值超出int可表示值的范圍時會發生什么,沒有標準規范。
例:在VS2013編譯環境下輸出的數值
二、atoi函數模擬實現
#include <stdio.h>
#include <limits.h>
#include <ctype.h>
//通過枚舉設置兩種狀態,分別代表字符串轉換的合法性
enum Status
{
VALID, //合法
INVALID //非法
};
enum Status status = INVALID; //定義全局變量 status 為 INVALID,若轉換合法,則將 status 變為 VALID,若非法則不變
int my_atoi(const char* str)
{
if (str == NULL) //字符串為空
{
return 0;
}
if (*str == '\0') //空白字符
{
return 0;
}
while (isspace(*str)) //字符串前面有多余的空格,則一直往后移尋找符號或數字
{
str++;
}
int flag = 0; //flag 標志數字的正負
if (*str == '+')
{
flag = 1;
str++;
}
else if (*str == '-')
{
flag = -1;
str++;
}
long long ret = 0;
while (isdigit(*str))
{
ret = ret * 10 + flag*(*str - '0');
if (ret<INT_MIN || ret>INT_MAX) //判斷轉換后的數字是否越界
{
return 0;
}
str++;
}
if (*str == '\0') //若字符串遍歷完就走這一步,也就意味著該字符串的轉換為合法的
{
status = VALID;
return (int)ret;
}
else //非法轉換
{
return (int)ret;
}
}
int main()
{
//int ret = my_atoi("-123");
int ret = my_atoi(" -2222222222");
if (status == VALID)
{
printf("合法的轉換:%d\n", ret);
}
else
printf("轉換不合法!返回值為:%d\n",ret);
return 0;
}
總結
基本上該函數的模擬實現要注意的細節都在上面的代碼注釋里。
還要再解釋的是為什么要將返回值定義成 long long 長整型,而不是stoi函數的返回值 int 型呢?
這是因為在計算求和的時候萬一出現越界,由于之前將返回值定義為 int 型,這時就會將已經越界的數字強制轉換為非越界的數字,那么就會導致錯誤的輸出結果和錯誤的合法性判斷。
原文鏈接:https://blog.csdn.net/weixin_47648037/article/details/127337726
相關推薦
- 2022-03-26 在ASP.Net?Core應用程序中使用Bootstrap4_實用技巧
- 2022-11-05 關于Linux下動態查看實時日志的命令_linux shell
- 2021-12-10 Oracle數據庫備份還原詳解_oracle
- 2022-07-30 基于docker安裝zabbix的詳細教程_zabbix
- 2022-07-24 elment-ui的上傳組件圖片不回顯
- 2023-12-14 統計字符串內某個字符出現的次數
- 2022-01-17 EF關于報錯Self referencing loop detected with type的原因以
- 2022-10-24 C語言詳解分析進程控制中進程終止的實現_C 語言
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支