gpt4 book ai didi

使用C将字符串常量转换为数值

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:13:30 25 4
gpt4 key购买 nike

我编写了一个 C 程序,它使用两种不同的算法将表示数值的字符串常量转换为其整数值。由于某些原因,第一个算法 atoi() 在大值上不能正确执行,而第二个算法 atoi_imp() 工作正常。这是优化问题还是其他错误?问题是第一个函数使程序的进程因错误而终止。

#include <stdio.h>
#include <string.h>

unsigned long long int atoi(const char[]);
unsigned long long int atoi_imp(const char[]);

int main(void) {
printf("%llu\n", atoi("9417820179"));
printf("%llu\n", atoi_imp("9417820179"));
return 0;
}

unsigned long long int atoi(const char str[]) {
unsigned long long int i, j, power, num = 0;
for (i = strlen(str) - 1; i >= 0; --i) {
power = 1;
for (j = 0; j < strlen(str) - i - 1; ++j) {
power *= 10;
}
num += (str[i] - '0') * power;
}
return num;
}

unsigned long long int atoi_imp(const char str[]) {
unsigned long long int i, num = 0;
for (i = 0; str[i] >= '0' && str[i] <= '9'; ++i) {
num = num * 10 + (str[i] - '0');
}
return num;
}

最佳答案

atoi 是 C 标准库的一部分,签名为 int atoi(const char *);

您声明存在具有该名称的函数,但给它不同的返回类型。请注意,在 C 中,函数名称是唯一重要的事情,工具链只能信任您在源代码中所说的内容。如果你对编译器撒谎,就像这里一样,所有的赌注都没有了。

您应该为自己的实现选择不同的名称以避免出现问题。


正如@pmg 所研究的那样,C 标准(链接到 C99.7.1.3)表示,使用 C 标准库中的名称作为您自己的全局符号(函数或全局变量)显然是未定义行为。小心鼻恶魔!

关于使用C将字符串常量转换为数值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55044306/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com