📘 C 语言 itoa
函数详解
1️⃣ 什么是 itoa
itoa
全称:integer to ASCII- 功能:将 整数转换为字符串(ASCII 表示)
- 函数原型(非标准 C,但在很多编译器支持,如
stdlib.h
或<stdlib.h>
):
char * itoa(int value, char *str, int base); |
---|
2️⃣ 参数说明
参数 | 说明 |
---|---|
value |
需要转换的整数 |
str |
存放转换后字符串的数组指针(调用者提供缓冲区) |
base |
数字进制(2~36),如二进制 2,十进制 10,十六进制 16 |
3️⃣ 返回值
- 返回
str
指针,即转换后的字符串 - 注意:
str
必须有足够的空间存放结果(包括负号和 '\0')
4️⃣ 使用示例
#include <stdio.h> |
---|
#include <stdlib.h> |
---|
int main() { |
---|
``int num = -255; |
---|
``char str[20]; |
---|
``itoa(num, str, 10); // 十进制 |
---|
``printf("Decimal: %s\n", str); |
---|
``itoa(num, str, 16); // 十六进制 |
---|
``printf("Hex: %s\n", str); |
---|
``itoa(num, str, 2); // 二进制 |
---|
``printf("Binary: %s\n", str); |
---|
``return 0; |
---|
} |
---|
输出示例:
Decimal: -255 |
---|
Hex: -FF |
---|
Binary: -11111111 |
---|
5️⃣ itoa
的实现原理(手写版)
#include <stdio.h> |
---|
#include <string.h> |
---|
void reverse(char *str) { |
---|
``int i, j; |
---|
``char temp; |
---|
``for (i = 0, j = strlen(str)-1; i < j; i++, j--) { |
---|
``temp = str[i]; |
---|
``str[i] = str[j]; |
---|
``str[j] = temp; |
---|
``} |
---|
} |
---|
char* my_itoa(int value, char* str, int base) { |
---|
``int i = 0; |
---|
``int isNegative = 0; |
---|
``if (value == 0) { |
---|
``str[i++] = '0'; |
---|
``str[i] = '\0'; |
---|
``return str; |
---|
``} |
---|
``if (value < 0 && base == 10) { |
---|
``isNegative = 1; |
---|
``value = -value; |
---|
``} |
---|
``while (value != 0) { |
---|
``int rem = value % base; |
---|
``str[i++] = (rem > 9) ? (rem - 10) + 'A' : rem + '0'; |
---|
``value /= base; |
---|
``} |
---|
``if (isNegative) |
---|
``str[i++] = '-'; |
---|
``str[i] = '\0'; |
---|
``reverse(str); |
---|
``return str; |
---|
} |
---|
int main() { |
---|
``char str[20]; |
---|
``printf("%s\n", my_itoa(-255, str, 10)); // Decimal |
---|
``printf("%s\n", my_itoa(-255, str, 16)); // Hex |
---|
``printf("%s\n", my_itoa(-255, str, 2)); // Binary |
---|
``return 0; |
---|
} |
---|
6️⃣ 注意事项
itoa
不是 ANSI C 标准函数,有些编译器不支持- 对于跨平台,推荐使用
sprintf
或snprintf
:
int num = -255; |
---|
char str[20]; |
---|
sprintf(str, "%d", num); // 十进制 |
---|
sprintf(str, "%x", num); // 十六进制 |
---|
- 处理负数时,只在 十进制 添加负号,其他进制一般不加
👌 明白了,阿杰,我给你写一个 完整 C 语言版进制转换工具 ,支持 二进制、八进制、十进制、十六进制 ,使用自定义 itoa
函数实现。
🛠️ C 语言进制转换工具(自定义 itoa)
#include <stdio.h> |
---|
#include <string.h> |
---|
// 反转字符串 |
---|
void reverse(char *str) { |
---|
``int i, j; |
---|
``char temp; |
---|
``for (i = 0, j = strlen(str)-1; i < j; i++, j--) { |
---|
``temp = str[i]; |
---|
``str[i] = str[j]; |
---|
``str[j] = temp; |
---|
``} |
---|
} |
---|
// 自定义 itoa 函数 |
---|
char* my_itoa(int value, char* str, int base) { |
---|
``int i = 0; |
---|
``int isNegative = 0; |
---|
``if (value == 0) { |
---|
``str[i++] = '0'; |
---|
``str[i] = '\0'; |
---|
``return str; |
---|
``} |
---|
``if (value < 0 && base == 10) { // 十进制负数处理 |
---|
``isNegative = 1; |
---|
``value = -value; |
---|
``} |
---|
``while (value != 0) { |
---|
``int rem = value % base; |
---|
``str[i++] = (rem > 9) ? (rem - 10) + 'A' : rem + '0'; |
---|
``value /= base; |
---|
``} |
---|
``if (isNegative) |
---|
``str[i++] = '-'; |
---|
``str[i] = '\0'; |
---|
``reverse(str); |
---|
``return str; |
---|
} |
---|
// 主程序:进制转换工具 |
---|
int main() { |
---|
``int num; |
---|
``char str[65]; // 64位整数最大二进制位 + '\0' |
---|
``int choice; |
---|
``printf("请输入要转换的整数: "); |
---|
``scanf("%d", &num); |
---|
``printf("选择目标进制: 1. 二进制 2. 八进制 3. 十进制 4. 十六进制\n"); |
---|
``scanf("%d", &choice); |
---|
``switch(choice) { |
---|
``case 1: |
---|
``my_itoa(num, str, 2); |
---|
``printf("二进制: %s\n", str); |
---|
``break; |
---|
``case 2: |
---|
``my_itoa(num, str, 8); |
---|
``printf("八进制: %s\n", str); |
---|
``break; |
---|
``case 3: |
---|
``my_itoa(num, str, 10); |
---|
``printf("十进制: %s\n", str); |
---|
``break; |
---|
``case 4: |
---|
``my_itoa(num, str, 16); |
---|
``printf("十六进制: %s\n", str); |
---|
``break; |
---|
``default: |
---|
``printf("无效选项!\n"); |
---|
``} |
---|
``return 0; |
---|
} |
---|
✅ 功能说明
- 支持 二进制、八进制、十进制、十六进制输出
- 自定义 itoa,跨平台可用,不依赖编译器非标准函数
- 负数处理:只有十进制显示负号
- 可扩展 :修改
my_itoa
即可支持任意进制(2~36)
👌 明白了,阿杰,我帮你写一个 C 语言进制转换器升级版,具备以下功能:
- 循环输入整数
- 一次性输出 二进制、八进制、十进制、十六进制
- 使用自定义
itoa
函数 - 可以连续转换多个数,输入
q
或Q
退出
🛠️ C 语言进制转换器(升级版)
#include <stdio.h> |
---|
#include <string.h> |
---|
#include <stdlib.h> |
---|
// 反转字符串 |
---|
void reverse(char *str) { |
---|
``int i, j; |
---|
``char temp; |
---|
``for (i = 0, j = strlen(str)-1; i < j; i++, j--) { |
---|
``temp = str[i]; |
---|
``str[i] = str[j]; |
---|
``str[j] = temp; |
---|
``} |
---|
} |
---|
// 自定义 itoa 函数 |
---|
char* my_itoa(int value, char* str, int base) { |
---|
``int i = 0; |
---|
``int isNegative = 0; |
---|
``if (value == 0) { |
---|
``str[i++] = '0'; |
---|
``str[i] = '\0'; |
---|
``return str; |
---|
``} |
---|
``if (value < 0 && base == 10) { // 十进制负数处理 |
---|
``isNegative = 1; |
---|
``value = -value; |
---|
``} |
---|
``while (value != 0) { |
---|
``int rem = value % base; |
---|
``str[i++] = (rem > 9) ? (rem - 10) + 'A' : rem + '0'; |
---|
``value /= base; |
---|
``} |
---|
``if (isNegative) |
---|
``str[i++] = '-'; |
---|
``str[i] = '\0'; |
---|
``reverse(str); |
---|
``return str; |
---|
} |
---|
// 显示所有进制 |
---|
void showAllBases(int num) { |
---|
``char str[65]; // 64位整数最大二进制位 + '\0' |
---|
``my_itoa(num, str, 2); |
---|
``printf("二进制: %s\n", str); |
---|
``my_itoa(num, str, 8); |
---|
``printf("八进制: %s\n", str); |
---|
``my_itoa(num, str, 10); |
---|
``printf("十进制: %s\n", str); |
---|
``my_itoa(num, str, 16); |
---|
``printf("十六进制: %s\n", str); |
---|
} |
---|
int main() { |
---|
``char input[100]; |
---|
``int num; |
---|
``printf("=== C 语言进制转换器 ===\n"); |
---|
``printf("输入整数进行转换,输入 'q' 或 'Q' 退出。\n\n"); |
---|
``while (1) { |
---|
``printf("请输入整数: "); |
---|
``fgets(input, sizeof(input), stdin); |
---|
| ``if (input[0] == 'q' || input[0] == 'Q')
| | ----------------------------------------------------- |
``break; |
---|
``num = atoi(input); |
---|
``showAllBases(num); |
---|
``printf("\n"); |
---|
``} |
---|
``printf("已退出转换器。\n"); |
---|
``return 0; |
---|
} |
---|
✅ 功能说明
- 循环输入:支持连续输入多个整数
- 输出所有进制:二进制、八进制、十进制、十六进制
- 自定义
itoa
:不依赖平台非标准函数 - 易扩展:可以加更多进制、支持大整数