• 了解C语言中的atoi函数和模拟实现


    目录

    1. atoi函数

    1.1 函数的声明

    1.2 函数的作用 

    1.3 函数的使用

    2. 模拟实现atoi函数

    2.1 整理思路 

    2.2 整份代码


    1. atoi函数

    1.1 函数的声明

    int atoi (const char * str);

    1.2 函数的作用 

    • 将字符串转化为int类型的数据。
    • 转化string字符串里面的涉及到可以转化为int类型的数字,然后作为返回值返回。
    • 该函数会从str地址开始,跳过所有空白字符,直到遇到第一个非空白的字符。然后从这个字符开始,判断是正号还是负号通过10为基准,将字符转化为int数据。
    • 字符串可以在组成整数的字符之后包含其他字符,这些字符将被忽略,并且对此函数的行为没有影响。
    • 如果str中的第一个非空白字符序列不是一个有效的整数,或者因为str为空或者它只包含空白字符而不存在这样的序列,则不执行转换。

    • 如果成功,该函数将转换后的整数作为整型值返回。如果转换后的值超出了int可表示值的范围,则会导致未定义的行为。如果有可能,请参阅strtol以获得更健壮的跨平台替代方案。

    1.3 函数的使用

    1. int main() {
    2. char arr[] = " 1234a000";
    3. int i = atoi(arr);
    4. printf("%d", i);
    5. return 0;
    6. }

    2. 模拟实现atoi函数

    2.1 整理思路 

    • 根据atoi函数的声明,我们知道了函数应该怎么定义。
    int atoi (const char * str);
    • 第一点:我们得对str指针进行非空判断。
    1.     //空指针
    2.     assert(str);
    • 第二点:对传入来的str指针指向的数据不能是一个空字符串,也就是不能为"\0"。
    1. //空字符串
    2. if (*str == '\0')
    3. return 0;
    • 第三点:该函数会从str地址开始,跳过所有空白字符,直到遇到第一个非空白的字符。
    1. //跳过空白字符
    2. //例如:“ 12345”,跳过前面的空格
    3. while (isspace(*str)) {
    4. str++;
    5. }
    • 第四点:判断遇到的第一个字符是正号还是负号。
    1. //flag:+ - 来表示
    2. int flag = 1;//1表示正号,-1表示负号
    3. if (*str == '+') {
    4. flag = 1;
    5. str++;
    6. }
    7. else if (*str == '-') {
    8. flag = -1;
    9. str++;
    10. }
    • 第五点:判断是不是字符数字,然后转换为int类型
    1. //为了方便
    2. long long r = 0;//因为r可能会超过INT_MAX或者低于INT_MIN,所以要想将r设置为long long类型
    3. while (*str) {
    4. //判断是否为数字字符
    5. if (isdigit(*str)) {
    6. //数字字符在字符表中都是按顺序排放的,所以‘1’-‘0’= 1
    7. //r * 10是为了保证前一位能进一位,例如字符串“12”,为了保证1到十位,所以要乘以10
    8. r = r * 10 + flag * (*str - '0');
    9. if (r > INT_MAX || r < INT_MIN) {
    10. if (flag == 1)//判断正负号
    11. return INT_MAX;
    12. else
    13. return INT_MIN;
    14. }
    15. str++;
    16. }
    17. else {
    18. return (int)r;
    19. }
    20. }
    •  第六点:因为需要判断my_atoi函数是合法转化还是非法转化,设置了一个枚举类型来作为标记。
    1. enum State
    2. {
    3. VALID,//0
    4. INVALID//1
    5. }sta = INVALID;//默认设置为非法

    2.2 整份代码

    1. enum State
    2. {
    3. VALID,//0
    4. INVALID//1
    5. }sta = INVALID;//默认设置为非法
    6. int my_atoi(const char* str) {
    7. //空指针
    8. assert(str);
    9. //空字符串
    10. if (*str == '\0')
    11. return 0;
    12. //跳过空白字符
    13. //例如:“ 12345”,跳过前面的空格
    14. while (isspace(*str)) {
    15. str++;
    16. }
    17. //flag:+ - 来表示
    18. int flag = 1;//1表示正号,-1表示负号
    19. if (*str == '+') {
    20. flag = 1;
    21. str++;
    22. }
    23. else if (*str == '-') {
    24. flag = -1;
    25. str++;
    26. }
    27. //为了方便
    28. long long r = 0;//因为r可能会超过INT_MAX或者低于INT_MIN,所以要想将r设置为long long类型
    29. while (*str) {
    30. //判断是否为数字字符
    31. if (isdigit(*str)) {
    32. //数字字符在字符表中都是按顺序排放的,所以‘1’-‘0’= 1
    33. //r * 10是为了保证前一位能进一位,例如字符串“12”,为了保证1到十位,所以要乘以10
    34. r = r * 10 + flag * (*str - '0');
    35. if (r > INT_MAX || r < INT_MIN) {
    36. if (flag == 1)//判断正负号
    37. return INT_MAX;
    38. else
    39. return INT_MIN;
    40. }
    41. str++;
    42. }
    43. else {
    44. return (int)r;
    45. }
    46. }
    47. sta = VALID;
    48. return (int)r;
    49. }
    50. int main() {
    51. char arr[] = " 1234a0000000000000000000000";
    52. int ret = my_atoi(arr);
    53. if (sta == VALID)
    54. printf("合法的转换:%d\n", ret);
    55. else
    56. printf("非法的转换:%d\n", ret);
    57. }

  • 相关阅读:
    IDEA新建SpringBoot项目时启动编译报错:Error:java: 无效的源发行版: 17
    数据结构题目收录(十八)
    qt使用QProcess实现进程通信
    干货 | Web自动化测试中显式等待与隐式等待该怎么用?
    如何在您的Shopify商店中添加实时聊天功能?
    Spring boot Actuator监控管理的快速入门和实战
    Docker搭建Mysql一主一从
    NSSCTF
    TFN MIX5 500 手持式光谱仪 合金分析仪 便携式X荧光光谱仪 合金手持式光谱仪
    嵌入式 Linux 入门(九、Linux 下的磁盘管理)
  • 原文地址:https://blog.csdn.net/ANNE_fly/article/details/133934112