在 Linux/Unix 系统中,标准 C 库(glibc)没有直接提供 itoa()
函数。itoa()
是一个非标准的函数,常见于一些编译器的扩展(如 Windows 的 MSVC),但并非 C/C++ 标准的一部分。
在 Linux 环境下,可以通过以下方式实现整数转字符串的功能:
sprintf()
或 snprintf()
#include <stdio.h>
int main() {
int num = 123;
char str[20];
sprintf(str, "%d", num); // 十进制
// snprintf(str, sizeof(str), "%d", num); // 更安全的版本
printf("String: %s\n", str);
return 0;
}
sprintf()
存在缓冲区溢出风险,建议优先使用 snprintf()
。asprintf()
(GNU 扩展)#define _GNU_SOURCE // 需在文件开头定义
#include <stdio.h>
#include <stdlib.h>
int main() {
int num = 123;
char *str;
asprintf(&str, "%d", num); // 自动分配内存
printf("String: %s\n", str);
free(str); // 需手动释放内存
return 0;
}
_GNU_SOURCE
宏,且仅在支持 GNU 扩展的系统(如 Linux)中可用。itoa()
函数如果需要复用,可以自行实现:
#include <stdio.h>
#include <string.h>
void reverse(char *str, int len) {
for (int i = 0; i < len/2; i++) {
char temp = str[i];
str[i] = str[len-i-1];
str[len-i-1] = temp;
}
}
char* itoa(int num, char *str, int base) {
int i = 0, is_negative = 0;
if (num == 0) {
str[i++] = '0';
str[i] = '\0';
return str;
}
if (num < 0 && base == 10) {
is_negative = 1;
num = -num;
}
while (num != 0) {
int rem = num % base;
str[i++] = (rem > 9) ? (rem-10) + 'a' : rem + '0';
num = num / base;
}
if (is_negative) str[i++] = '-';
str[i] = '\0';
reverse(str, i);
return str;
}
int main() {
int num = -123;
char str[20];
itoa(num, str, 10); // 十进制
printf("String: %s\n", str);
return 0;
}
方法 | 标准性 | 安全性 | 适用场景 |
---|---|---|---|
sprintf/snprintf |
C 标准 | 需手动控制缓冲区 | 通用场景 |
asprintf |
GNU 扩展 | 自动分配内存 | Linux/GNU 环境 |
自定义 itoa |
无依赖 | 需自行处理逻辑 | 需要非十进制或特殊需求 |
建议优先使用 snprintf()
或 asprintf()
,避免直接使用非标准函数。