C错误:对'_itoa'的引用未定义。

9

我正在尝试将一个整数转换为字符并写入文件,使用以下代码:

fputc(itoa(size, tempBuffer, 10), saveFile);

我收到了以下警告和信息:

警告:itoa的声明是隐式的

undefined reference to '_itoa'

我已经包含了stdlib.h,并使用以下编译选项进行编译:

gcc -Wall -pedantic -ansi

任何帮助都将不胜感激,谢谢。

1
我猜测你使用的标准C库中可能没有itoa函数。你可以尝试指定标志“-fpermissive”来查看代码是否能够正常工作。 - GWW
1
“itoa”函数在“官方”的标准库中并不存在。显然,您正在使用的标准库没有提供“itoa”。您的“-pedantic”和“-ansi”标志不会有任何帮助。相反,它们实际上可能会使情况变得更糟,因为它们会隐藏非标准函数(我不知道它们是否真的这样做)。尝试在没有它们的情况下编译。 - AnT stands with Russia
2个回答

23

itoa不是标准库的一部分。我怀疑要么-ansi阻止你使用它,要么根本不可用。

我建议使用sprintf()

如果你采用c99标准,可以使用更安全的snprintf()

char buffer[12];
int i = 20;
snprintf(buffer, 12,"%d",i);

1
你需要一个更大的缓冲区来处理负号。 - user1899861
1
@RocketRoy 这只是一个例子。在这个例子中,值20可以很好地适应于char[10],而这也是OP使用的缓冲区大小。但是,是的,一个带符号的32位整数需要char[12]来处理符号和\0 - Brian Roach
1
@BrianRoach 虽然你是完全正确的,但为了那些喜欢复制粘贴的人们,我已经在示例中更改了缓冲区的大小。 - chacham15
Brian的原始答案阐明了事实。假设“int”适合12字节字符串是完全不正确的,如果作为事实发布,可能会误导人们。例如,在AVR 8位系统上,“int”通常是16位(2字节)。 - kevr

2
这里告诉你,在编译阶段,itoa 是未知的:

警告:隐式声明 'itoa'

如果此函数在您的系统上存在,则缺少声明它的头文件。编译器会假设它是一个带有不特定数量参数并返回 int 的函数。
这条来自加载器阶段的消息:

对 '_itoa' 的未定义引用

说明加载器也没有在任何已知库中找到这样的函数。
因此,您应该考虑采纳 Brian 的建议,用标准函数替换 itoa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接