我听不懂。当我的函数从主字符中的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));
}
在函数int mx_atoi(const char *str) {...
中,您正在计算类型为long
的结果,但是函数返回了int
;因此,如果存储在类型为num
的long
中的结果不适合int
,则会丢失某些内容(实际上,由于对有符号整数值进行了转换,因此行为是“实现定义的”,即依赖于编译器的) )。结果可以按位截断,产生一个“看起来”与您输入的十进制数字完全不同的数字。
将int mx_atoi(const char *str)
设为long mx_atoi(const char *str)
,使用long
变量存储结果,然后别忘了在%ld
中使用格式说明符%d
而不是printf
。