模拟实现atoi()—— C语言

淩亂°似流年 2023-09-29 09:27 50阅读 0赞

库函数atoi(),将所指向的字符串转换为一个整数(类型为int型)

目录

1.库函数 atoi()

2.库函数 atoi()的实现

3.库函数atoi()的模拟实现


1.库函数 atoi()

声明

  1. int atoi(const char *str)

参数 str -- 要转换为整数的字符串。

返回值 函数返回转换后的长整数,如果没有执行有效的转换,则返回零。

头文件

注意 atoi的规则是:跳过不可见字符,碰到负号或者数字开始转换,转换到非数字字符为止。

2.库函数 atoi()的实现

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. int main()
  5. {
  6. int val;
  7. char str[20];
  8. strcpy(str, "989934896");
  9. val = atoi(str);
  10. printf("字符串值 = %s, 整型值 = %d\n", str, val);
  11. strcpy(str, "123runoob.com");
  12. val = atoi(str);
  13. printf("字符串值 = %s, 整型值 = %d\n", str, val);
  14. return(0);
  15. }

3.库函数atoi()的模拟实现

  1. int main()
  2. {
  3. char arr[20] = " -12a34";
  4. int ret = my_atoi(arr);
  5. printf("%d\n", ret);
  6. return 0;
  7. }

先把主函数函数写好,下面来考虑字符串出现的可能形式

字符串中可能出现:

1.数字形式的字符

2.空指针

3.空字符串

4.非数字字符

5.前面有空白字符

6.前面有+-

下面来实现

  1. #include<assert.h>
  2. #include<ctype.h>
  3. #include<limits.h>
  4. enum status
  5. {
  6. VALID,
  7. INVALID
  8. }status=INVALID;//非法
  9. int my_atoi(const char* str)
  10. {
  11. int flag = 1;
  12. //空指针
  13. assert(str);
  14. //字符串为空
  15. if (*str == '\0')
  16. {
  17. return 0;
  18. }
  19. //空白字符
  20. while (isspace(*str))
  21. {
  22. str++;
  23. }
  24. //正负号
  25. if (*str == '+')
  26. {
  27. flag = 1;
  28. str++;
  29. }
  30. else if(*str=='-')
  31. {
  32. flag = -1;
  33. str++;
  34. }
  35. //数字字符
  36. long long n = 0;
  37. while (*str!='\0')
  38. {
  39. if (isdigit(*str))
  40. {
  41. n = n * 10 +flag*(* str - '0') ;//存放比整型更大的值
  42. if (n<INT_MIN || n>INT_MAX)
  43. {
  44. n= 0;
  45. break;
  46. }
  47. }
  48. else
  49. {
  50. break;
  51. }
  52. str++;
  53. }
  54. if (*str == '\0')
  55. {
  56. status = VALID;
  57. }
  58. return (int)n;
  59. }
  60. int main()
  61. {
  62. char arr[20] = " -12a34";
  63. int ret = my_atoi(arr);
  64. if (status == VALID)
  65. printf("合法转化:%d\n", ret);
  66. else
  67. {
  68. printf("非法转化:%d\n", ret);
  69. }
  70. return 0;
  71. }

watermark_type_d3F5LXplbmhlaQ_shadow_50_text_Q1NETiBA5b-r5Yiw6ZSF6YeM5p2l5ZGA_size_10_color_FFFFFF_t_70_g_se_x_16


发表评论

表情:
评论列表 (有 0 条评论,50人围观)

还没有评论,来说两句吧...

相关阅读

    相关 c语言模拟实现memmove

    为什么写这篇博客,因为我很多次都被它考住了!!!!!!!!!! 首先 memmove 是一个内存操作函数,不是字符串操作函数,它可以处理多种类型的数据。 它的原型

    相关 atoi(c++实现

    写atoi时,发现有很多细节要注意,经过多次测试,写了一个考虑比较全面的版本。class Solution \{public: int atoi(const char \str