如何在 C 语言中实现数字和字符串的相互转换?
在 C 语言中,将数字转换为字符串和将字符串转换为数字可以通过标准库函数实现。以下是常见的方法和示例:
1. 将数字转换为字符串
使用 sprintf
sprintf 是一个标准库函数,可以格式化数字并写入字符串。
#include <stdio.h>
int main() {
int number = 123;
char str[20]; // 确保数组足够大以存储结果
sprintf(str, "%d", number); // 将整数转换为字符串
printf("String: %s\n", str);
double floatNum = 123.456;
sprintf(str, "%.2f", floatNum); // 将浮点数转换为字符串,保留两位小数
printf("String: %s\n", str);
return 0;
}
优点:灵活,可以格式化多种数据类型。
注意:确保目标字符串有足够的空间存储结果。
使用 itoa(非标准函数)
一些编译器(如 MSVC)提供 itoa 函数,用于将整数转换为字符串。
#include <stdio.h>
#include <stdlib.h> // 包含 itoa 的声明
int main() {
int number = 123;
char str[20];
itoa(number, str, 10); // 将整数转换为字符串,基数为 10
printf("String: %s\n", str);
return 0;
}
优点:简单直接。
注意:itoa 是非标准函数,跨平台支持性较差。
手动实现
可以通过逐位提取数字并手动拼接字符串。
#include <stdio.h>
void intToStr(int num, char* str) {
int i = 0, isNegative = 0;
if (num < 0) { // 处理负数
isNegative = 1;
num = -num;
}
do {
str[i++] = (num % 10) + '0'; // 提取最低位并转换为字符
num /= 10;
} while (num > 0);
if (isNegative) str[i++] = '-'; // 添加负号
str[i] = '\0'; // 添加字符串结束符
// 反转字符串
for (int j = 0; j < i / 2; j++) {
char temp = str[j];
str[j] = str[i - 1 - j];
str[i - 1 - j] = temp;
}
}
int main() {
int number = -123;
char str[20];
intToStr(number, str);
printf("String: %s\n", str);
return 0;
}
优点:跨平台,无需依赖库函数。
缺点:代码相对复杂,适合学习和练习。
2. 将字符串转换为数字
使用 atoi
atoi 是标准库函数,可以将字符串转换为整数。
#include <stdio.h>
#include <stdlib.h> // 包含 atoi 的声明
int main() {
char str[] = "123";
int number = atoi(str); // 转换为整数
printf("Number: %d\n", number);
return 0;
}
优点:简单直接。
注意:atoi 不处理错误输入,输入非数字字符串时返回 0。
使用 strtol
strtol 提供更多控制,支持错误检查和基数设置。
#include <stdio.h>
#include <stdlib.h> // 包含 strtol 的声明
int main() {
char str[] = "123abc";
char* endptr;
long number = strtol(str, &endptr, 10); // 转换为整数,基数为 10
printf("Number: %ld\n", number); // 输出转换后的数字
printf("Unconverted part: %s\n", endptr); // 输出未转换部分
return 0;
}
优点:更安全,可以处理无效输入。
注意:检查 endptr 是否指向字符串末尾以确认转换是否成功。
使用 sscanf
sscanf 是输入格式化函数,可以从字符串中提取数字。
#include <stdio.h>
int main() {
char str[] = "123";
int number;
sscanf(str, "%d", &number); // 提取整数
printf("Number: %d\n", number);
return 0;
}
优点:灵活,可以提取多种数据类型。
缺点:需要明确指定数据格式。
手动实现
通过遍历字符串逐位解析数字。
#include <stdio.h>
#include <ctype.h> // 用于 isdigit
int strToInt(const char* str) {
int num = 0, isNegative = 0;
if (*str == '-') { // 处理负数
isNegative = 1;
str++;
}
while (*str) {
if (!isdigit(*str)) break; // 跳过非数字字符
num = num * 10 + (*str - '0'); // 累加数字
str++;
}
return isNegative ? -num : num;
}
int main() {
char str[] = "-123";
int number = strToInt(str);
printf("Number: %d\n", number);
return 0;
}
优点:跨平台,无需依赖库函数。
缺点:代码复杂,需自行处理各种特殊情况。
总结
数字转字符串
- 推荐:
sprintf(标准函数,灵活)或itoa(简单直接,但非标准)。 - 自定义实现:用于学习或无标准库支持的环境。
字符串转数字
- 推荐:
strtol(安全且灵活)。 - 简单场景:
atoi或sscanf。 - 自定义实现:用于特定需求或学习。
选择方法时,应根据应用场景、输入复杂度和性能需求权衡使用。更多详细内容请关注其他相关文章。