模拟实现atoi

简介: 模拟实现atoi

介绍atoi函数


atoi


6dbf657ca189aa0e43f8b561e2c2702f_1cb86078981841178522c49eaf6dfad9.png


将数字字符串转化为整形


实例如下


#include<stdio.h>
#include<stdlib.h>
int main()
{
  char ch[] = "123";
  int i = atoi(ch);
  printf("%d\n", i);
  return 0;
}


9e461eb9641daeaaf6a83ba61e0adf2d_a5f5585c950a4e1facd21b6ce555f51f.png


实现思路


如果在最理想状态下代码实现比较简单


#include<stdio.h>
int my_atoi(const char* str)
{
  int ret = 0;
  while (*str)
  {
  ret = ret * 10 + (*str - '0');
  str++;
  }
  return ret;
}
int main()
{
  char ch[] = "123";
  int ret = my_atoi(ch);
  printf("%d\n", ret);
  return 0;
}


148a8ae665bdccad31c879d2c7b417fc_3e8c1689f53649a1a65f179324c1c0a8.png


需要考虑的极端情况


1. 空指针
 2. 空字符串
 3. 空格
 4. +- 符号
 5. 越界
 6. 非数字字符


在考虑极端情况下,该如何实现次函数呢?


#include<stdio.h>
#include<assert.h>
#include<limits.h>
#include<ctype.h>
enum M
{
  VALID,
  INVALID
}m=INVALID;//默认返回值是无效的
int my_atoi(const char* str)
{
  assert(str);
  int flag = 1;
  //如果是空字符串
  if (*str == '\0')
  {
  return;
  }
  //跳过空白字符
  while (isspace(*str))
  {
  str++;
  }
  //判断符号的正负
  if (*str == '+')
  {
  flag = 1;
  str++;
  }
  else if (*str == '-')
  {
  flag = -1;
  str++;
  }
  long long ret = 0;
  while (*str)
  {
  //判断是否为数字字符串
  if (isdigit(*str))
  {
    ret = ret * 10 + flag*(*str - '0');
    //判断是否越界
    if (ret > INT_MAX || ret < INT_MIN)
    {
    return;
    }
  }
  else
  {
    return (int)ret;
  }
  str++;
  }
  //当遇到字符串结尾的'\0'时正常返回
  if (*str == '\0')
  {
  m = VALID;
  }
  return (int)ret;
}
int main()
{
  char ch[] = "123adf";
  int ret = my_atoi(ch);
  if (m == INVALID)
  {
  printf("无效返回:>%d\n", ret);
  }
  else if(m==VALID)
  {
  printf("有效返回:>%d\n", ret);
  }
  return 0;
}

b52070ca2b3558ba22274c0e0ecb94f4_e90b80bdefff4d4ab94b9365ee666fb6.png


此次模拟实现虽然是成功啦,但还是有些没有考虑到的因素。待之后进行完善


目录
相关文章
|
移动开发 安全 数据安全/隐私保护
iOS 全局自动化代码混淆工具!支持 cocoapod 组件代码一并混淆
iOS 全局自动化代码混淆工具!支持 cocoapod 组件代码一并混淆
|
7月前
|
数据采集 分布式计算 数据可视化
大数据项目成功的秘诀——不只是技术,更是方法论!
大数据项目成功的秘诀——不只是技术,更是方法论!
199 8
大数据项目成功的秘诀——不只是技术,更是方法论!
|
缓存 C语言
C语言 : 将一句话的单词进行倒置(逆序)
C语言 : 将一句话的单词进行倒置(逆序)
217 0
|
存储 SQL 自然语言处理
利用 HBuilderX 设置新闻中心版式
利用 HBuilderX 设置新闻中心版式
296 2
利用 HBuilderX 设置新闻中心版式
Element UI 源码改造 —— 自定义数字输入框的实现
Element UI 源码改造 —— 自定义数字输入框的实现
497 1
|
人工智能 NoSQL atlas
MongoDB Atlas与大语言模型的梦幻联动:如何瞬间提升企业级AI应用的构建效率?
【8月更文挑战第8天】在大数据时代,企业需挖掘数据价值。MongoDB Atlas作为云端数据库服务,以灵活性著称,减轻运维负担并支持全球数据分布。大语言模型(LLMs)革新AI构建方式,擅长处理自然语言。本文通过对比展示如何整合Atlas与LLMs,构建高效企业级AI应用:Atlas确保数据高效存储管理,LLMs提供语言理解与生成能力,二者结合加速AI应用开发并激发创新潜能。
324 1
|
存储 安全
atomic_int
atomic_int
630 0
|
SQL 存储 关系型数据库
MySQL新增字段/索引会不会锁表?
MySQL新增字段/索引会不会锁表?
1260 0
|
Web App开发 JavaScript
使用CRXjs、Vite、Vue 开发 Chrome 多页面插件,手动配置 vite.config.ts 和 manifest.json 文件
使用CRXjs、Vite、Vue 开发 Chrome 多页面插件,手动配置 vite.config.ts 和 manifest.json 文件
735 0