跳转到内容

C 编程/stdlib.h/itoa

来自维基教科书,自由的教科书

itoainteger to ASCII)函数是标准 C 编程语言的广泛非标准扩展。它不能移植地使用,因为它没有在任何 C 语言标准中定义;但是,编译器通常通过头文件 <stdlib.h> 在非标准模式下提供它,因为它是在标准库函数 atoi 的逻辑对应物。

void itoa(int input, char *buffer, int radix)

itoa 接受整数输入值 input 并将其转换为以 radix 为基数的数字。结果数字(以 radix 为基数的数字序列)被写入到输出缓冲区 buffer 中。

根据实现方式,itoa 可能返回指向 buffer 中第一个字符的指针,或者设计为如果传递一个空 buffer 则该函数将返回本来写入到有效 buffer 中的字符串的长度。

要将数字转换为以 8(八进制)、10(十进制)或 16(十六进制)为基数的字符串,可以使用标准库函数 sprintf 作为标准合规的替代方案。

K&R 实现

[编辑 | 编辑源代码]

函数 itoa 出现在 Kernighan 和 Ritchie 的《C 编程语言》第一版中,第 60 页。第二版《C 编程语言》(“K&R2”)包含 itoa 的以下实现,第 64 页 [对于西班牙语版本,请参阅第 47 页]。这本书指出该实现存在几个问题,包括它没有正确处理最负数 -2字长-1[1]

 /* itoa:  convert n to characters in s */
 void itoa(int n, char s[])
 {
     int i, sign;
 
     if ((sign = n) < 0)  /* record sign */
         n = -n;          /* make n positive */
     i = 0;
     do {       /* generate digits in reverse order */
         s[i++] = n % 10 + '0';   /* get next digit */
     } while ((n /= 10) > 0);     /* delete it */
     if (sign < 0)
         s[i++] = '-';
     s[i] = '\0';
     reverse(s);
 }

上面使用的函数 reverse 在前面两页实现。

 #include <string.h>
 
 /* reverse:  reverse string s in place */
 void reverse(char s[])
 {
     int i, j;
     char c;
 
     for (i = 0, j = strlen(s)-1; i<j; i++, j--) {
         c = s[i];
         s[i] = s[j];
         s[j] = c;
     }
 }

其他出现

[编辑 | 编辑源代码]

itoa 函数(以及类似的函数 ftoa,它将浮点数转换为字符串)在第一版 Unix 手册中列出。[2] 不同于上面的版本,Unix 库版本具有大致等效于以下内容的接口:

void itoa(int input, void (*subr)(char))

它将在输出字符串中的每个字符上调用回调例程 subr,从而消除了需要一个足够大的缓冲区来容纳整个字符串。


参考资料

[编辑 | 编辑源代码]
  1. 有关此练习的解决方案,请参阅 clc-wiki.net 上的 "K&R2 solutions"
  2. "Unix Programmer's Manual",1971 年 11 月 3 日。部分 "Library routines"
[编辑 | 编辑源代码]
华夏公益教科书