实现我自己的Atoi()时有一些错误

问题描述 投票:0回答:1

我听不懂。当我的函数从主字符中的char返回时,是随机数。原始atoi()返回-1。我当前正在使用C11版本。我收到某人的消息,那是因为int溢出,我需要从函数中返回int,但是我现在返回的时间很长。如果不是2147483647,如何检测intOverflow

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

bool mx_isdigit(int c) {
    return c >= 48 && c <= 57;
}


bool mx_isspace(char c) {
    return (c >= 9 && c <= 13) || c == 32;
}


int mx_atoi(const char *str) {
    long num = 0;
    int sign = 1;

    for (; mx_isspace(*str); str++);

    if (*str == '-' || *str == '+') {
        sign = *str == '-' ? -sign : sign;
        str++;
    }

    for (; *str; str++) {
        if (!mx_isdigit(*str)) {
            break;
        }
        num = (num * 10) + (*str - '0');
    }
    return sign == -1 ? -num : 0 + num;
}

int main(void) {

    char str[100] = "12327123061232712306";
    printf("R: %d\n", atoi(str));
    printf("M: %d", mx_atoi(str));
}
c c11 atoi
1个回答
0
投票

在函数int mx_atoi(const char *str) {...中,您正在计算类型为long的结果,但是函数返回了int;因此,如果存储在类型为numlong中的结果不适合int,则会丢失某些内容(实际上,由于对有符号整数值进行了转换,因此行为是“实现定义的”,即依赖于编译器的) )。结果可以按位截断,产生一个“看起来”与您输入的十进制数字完全不同的数字。

int mx_atoi(const char *str)设为long mx_atoi(const char *str),使用long变量存储结果,然后别忘了在%ld中使用格式说明符%d而不是printf

© www.soinside.com 2019 - 2024. All rights reserved.