C语言刷题(模拟实现atoi)——“C”

简介: C语言刷题(模拟实现atoi)——“C”

各位CSDN的uu们你们好呀,今天,小雅兰来为大家分享一个函数的模拟实现,这是一个比较有意思的东西,下面,让我们进入atoi的世界吧

eeb9a92f73e74041a271eaf01d5c67f4.png

1c643ef9262c47be9a8a5894f482b743.png

可知:atoi的功能是把一个字符串转化成整数

剑指offer上出现过这样一个场面:

ca3371e653464f1ea4c197e60281fc31.png

cc64ae5014074bc2a8870069a9c74088.png

302a5d2555834e6c954b8e5179f108eb.png

4fb17f37e6b846c5bc79661c6b998c43.png

6c73f49740f24464bf3a61208a54341d.png

34fc1dc63adb41d1b647d407ad00888d.png

3247510e8c8447f1ad06d2c17e49da7f.png

8155493c0bd94e17b278f9b3e849b089.png

5805f69dc66e4776a86875f7b5b0ee37.png

84b1b8bc6da9460a9030cdbf28a8e8e8.png

ec814ab0b5f449f48ef727b441f22fe1.png

858595f1c021473eb7cd2dabc7dd5ffe.png

43d2a2d54cfd4542ad1f923fe480e008.png

实质上这个代码案例,就是讲的atoi的模拟实现

为了不像上述面试案例的这位程序员一样:我们首先来看看,模拟实现atoi的注意事项

  • 空指针问题
  • 空字符串问题
  • +和-问题
  • 非数字字符问题
  • 越界问题

为了解决空指针问题,首先想到的是当然是断言啦!!!

//解决空指针问题
assert(str);

解决空字符串问题:

//解决空字符串问题
if (*str == '\0')
{
  return 0;
}

解决+和-的问题:

//解决+ —号的问题
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 0;
    }
  }
  else
  {
    return (int)ret;
  }
  str++;
}

模拟实现atoi源代码如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
#include<limits.h>
#include<ctype.h>
enum State
{
  VALID,
  INVALID
};
enum State s = INVALID;//非法的状态
//模拟实现atoi
//空指针
//空字符串
//  +  -
//非数字字符
//越界
int my_atoi(const char* str)
{
  //解决空指针问题
  assert(str);
  int flag = 0;
  //解决空字符串问题
  if (*str == '\0')
  {
    return 0;
  }
  //解决+ —号的问题
  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 0;
      }
    }
    else
    {
      return (int)ret;
    }
    str++;
  }
  if (*str == '\0')
  {
    s = VALID;
  }
  return (int)ret;
}
int main()
{
  int ret = my_atoi("-1234567890");
  if (s == INVALID)
  {
    printf("非法转换\n");
    printf("%d\n", ret);
  }
  else
  {
    printf("合法转换\n");
    printf("%d\n", ret);
  }
  return 0;
}

好啦,小雅兰今天的模拟实现atoi就到这里啦,继续加油!!!

a1360e6abacb45d6bb245e1806692d61.jpg

相关文章
|
5月前
|
存储 C语言
【C语言】基础刷题训练4(含全面分析和代码改进示例)
【C语言】基础刷题训练4(含全面分析和代码改进示例)
|
3月前
|
机器学习/深度学习 编译器 C语言
C语言刷题(中)(保姆式详解)
C语言刷题(中)(保姆式详解)
23 0
|
5月前
|
C语言
【C语言刷题训练】——第7节(含代码与分析思路)
【C语言刷题训练】——第7节(含代码与分析思路)
|
5月前
|
测试技术 C语言 C++
【C语言刷题训练——6】鹏哥C语言刷题训练营笔记,含代码讲解改进
【C语言刷题训练——6】鹏哥C语言刷题训练营笔记,含代码讲解改进
|
5月前
|
存储 C语言
【C语言】鹏哥C语言刷题训练营——第5节内容笔记(含代码全面分析和改进,讲解)
【C语言】鹏哥C语言刷题训练营——第5节内容笔记(含代码全面分析和改进,讲解)
|
7月前
|
C语言
C语言刷题(函数)
C语言刷题(函数)
|
7月前
|
C语言
C语言刷题(数组)
C语言刷题(数组)
|
7月前
|
存储 C语言
【C语言刷题系列】求一个数组中两个元素a和b的和最接近整数m
【C语言刷题系列】求一个数组中两个元素a和b的和最接近整数m
|
7月前
|
C语言
C语言刷题(循环结构程序设计)
C语言刷题(循环结构程序设计)
|
7月前
|
存储 算法 C语言
【C语言刷题系列】消失的数字
【C语言刷题系列】消失的数字