• atoi函数及其模拟实现


     atoi的函数声明及功能如下:

    这个函数的功能是将字符串转换为整形,那么具体是怎么样的呢

    先看几个例子:

     当字符串中的数字前有空白字符时,会把空白字符去掉。

     当字符串中间有字母时,只会转换字母前的数字。

     字符串数字超过最大整形表示的范围时,返回整形最大值(最小值同理)。

    有一个转换为整形的最大值

     空格后第一个字符是字母,会返回0。

    刚开始就是非法字符

    因此,我们模拟实现时,要考虑以上几种非法输入情况:

    1.空字符串

    2.空白字符

    3.处理+-号

    4.过大值过小值

    5.数字中间有其他字符

    atoi模拟实现:

    1. #include <stdio.h>
    2. #include <ctype.h>
    3. #include <assert.h>
    4. #include <stdlib.h>
    5. enum State
    6. {
    7. VALID,
    8. INVALID
    9. }sta = INVALID;//默认设置为非法
    10. int my_atoi(const char* str)
    11. {
    12. //空指针
    13. assert(str);
    14. //空字符串
    15. if (*str == '\0')
    16. return 0;
    17. //跳过空白字符
    18. while (isspace(*str))
    19. {
    20. str++;
    21. }
    22. //处理+-
    23. int flag = 1;
    24. if (*str == '+')
    25. {
    26. flag = 1;
    27. str++;
    28. }
    29. else if(*str == '-')
    30. {
    31. flag = -1;
    32. str++;
    33. }
    34. long long r = 0;
    35. while (*str)
    36. {
    37. if(isdigit(*str))
    38. {
    39. r = r * 10 + flag*((long long)*str - '0');
    40. if (r > INT_MAX || r < INT_MIN)
    41. {
    42. if (flag == 1)
    43. return INT_MAX;
    44. else
    45. return INT_MIN;
    46. }
    47. str++;
    48. }
    49. else
    50. {
    51. return (int)r;
    52. }
    53. }
    54. sta = VALID;
    55. return (int)r;
    56. }
    57. int main()
    58. {
    59. char arr[] = " 12ab34";//加几个空格
    60. int ret = my_atoi(arr);
    61. if (sta == VALID)
    62. printf("合法的转换:%d\n", ret);
    63. else
    64. printf("非法的转换:%d\n", ret);
    65. return 0;
    66. }

    在模拟实现过程中,我们定义了枚举类型State,目的是为了避免歧义,比如,当给my_atoi传入空字符串时,函数返回0,同时,当给my_atoi传入字符串"0"时,函数也应该返回0,这势必会造成歧义,因此,才定义了这样一个枚举类型,用枚举类型定义一个枚举变量sta,初始值为INVALID,当函数正常返回时,sta置为VALID,最终根据sta的值区分歧义!

  • 相关阅读:
    素质教育正式提出30周年 提高实际应用能力成为教育新选择
    使用污点分析检查log4j问题
    软件工程的概念及其重要性
    jvm-类加载
    Squeeze-and-Excitation Networks总结
    多径信道下通过LMS均衡算法提高通信质量——详细版
    axios全局路由拦截的设置方法
    Redis缓存雪崩、击穿、穿透
    深度剖析「圈组」关系系统设计 | 「圈组」技术系列文章
    vue computed作用特点及使用场景及示例
  • 原文地址:https://blog.csdn.net/qq_48460693/article/details/133803494