字符串相关函数(数值转字符串、字符串转数值)
一、字符串转数值函数
1. 基本转换函数
atoi(const char *str)
:将字符串转为int
类型atol(const char *str)
:将字符串转为long int
类型atoll(const char *str)
:将字符串转为long long int
类型atof(const char *str)
:将字符串转为double
类型
这些函数会跳过开头的空白字符,直到遇到数字或正负号开始转换,遇到非数字字符停止。
2. 更灵活的转换函数
strtol(const char *str, char **endptr, int base)
:转换为long int
,支持指定进制(2-36)strtoll(const char *str, char **endptr, int base)
:转换为long long int
strtod(const char *str, char **endptr)
:转换为double
strtof(const char *str, char **endptr)
:转换为float
这些函数通过endptr
参数可以获取转换停止的位置,便于错误处理。
二、数值转字符串函数
sprintf(char *str, const char *format, ...)
:将格式化的数值写入字符串snprintf(char *str, size_t size, const char *format, ...)
:类似sprintf
,但限制最大写入字节数,更安全itoa(int value, char *str, int base)
:非标准函数,将整数转为指定进制的字符串(某些编译器支持)
三、扩展示例代码
代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
// 字符串转整数并处理错误
int str_to_int(const char *str, int *result) {
char *endptr;
long val;
errno = 0;
val = strtol(str, &endptr, 10);
// 检查各种可能的错误
if ((errno == ERANGE && (val == LONG_MAX || val == LONG_MIN)) ||
(errno != 0 && val == 0)) {
perror("转换错误");
return 0;
}
if (endptr == str) {
fprintf(stderr, "没有有效的数字\n");
return 0;
}
// 检查是否超出int范围
if (val > INT_MAX || val < INT_MIN) {
fprintf(stderr, "数值超出int范围\n");
return 0;
}
*result = (int)val;
return 1;
}
// 字符串转浮点数并处理错误
int str_to_double(const char *str, double *result) {
char *endptr;
errno = 0;
*result = strtod(str, &endptr);
if ((errno == ERANGE && (*result == HUGE_VAL || *result == -HUGE_VAL)) ||
(errno != 0 && *result == 0)) {
perror("转换错误");
return 0;
}
if (endptr == str) {
fprintf(stderr, "没有有效的数字\n");
return 0;
}
return 1;
}
// 整数转字符串
void int_to_str(int num, char *buffer, size_t size) {
snprintf(buffer, size, "%d", num);
}
// 浮点数转字符串
void double_to_str(double num, char *buffer, size_t size, int precision) {
char format[20];
snprintf(format, sizeof(format), "%%.%df", precision);
snprintf(buffer, size, format, num);
}
int main() {
// 1. 字符串转数值示例
printf("===== 字符串转数值示例 =====\n");
// 基本整数转换
const char *int_str = "12345";
int int_val;
if (str_to_int(int_str, &int_val)) {
printf("字符串 \"%s\" 转换为整数: %d\n", int_str, int_val);
}
// 带符号的整数
const char *signed_str = "-9876";
if (str_to_int(signed_str, &int_val)) {
printf("字符串 \"%s\" 转换为整数: %d\n", signed_str, int_val);
}
// 浮点数转换
const char *float_str = "3.1415926535";
double double_val;
if (str_to_double(float_str, &double_val)) {
printf("字符串 \"%s\" 转换为浮点数: %.6f\n", float_str, double_val);
}
// 科学计数法
const char *sci_str = "1.234e5";
if (str_to_double(sci_str, &double_val)) {
printf("字符串 \"%s\" 转换为浮点数: %.2f\n", sci_str, double_val);
}
// 错误转换示例
const char *error_str = "123abc";
if (str_to_int(error_str, &int_val)) {
printf("字符串 \"%s\" 转换为整数: %d\n", error_str, int_val);
} else {
printf("字符串 \"%s\" 转换失败\n", error_str);
}
// 2. 数值转字符串示例
printf("\n===== 数值转字符串示例 =====\n");
int num = -54321;
char str[50];
int_to_str(num, str, sizeof(str));
printf("整数 %d 转换为字符串: \"%s\"\n", num, str);
double fnum = 2.718281828;
double_to_str(fnum, str, sizeof(str), 4);
printf("浮点数 %.6f 转换为字符串(保留4位小数): \"%s\"\n", fnum, str);
// 格式化转换
int hex_num = 255;
snprintf(str, sizeof(str), "十进制: %d, 十六进制: 0x%x, 八进制: 0%o",
hex_num, hex_num, hex_num);
printf("多格式转换: \"%s\"\n", str);
return 0;
}
运行结果
代码说明
这个示例包含以下特点:
- 封装的转换函数:
str_to_int
:字符串转整数,包含完整的错误处理str_to_double
:字符串转浮点数,处理各种错误情况int_to_str
:整数转字符串double_to_str
:浮点数转字符串,可指定精度
- 全面的错误处理:
- 检查范围错误(ERANGE)
- 检查无效输入(无有效数字)
- 检查整数溢出(超出 int 范围)
- 多样化转换示例:
- 基本整数转换
- 带符号整数转换
- 浮点数转换
- 科学计数法转换
- 错误输入处理
- 多格式数值转字符串
- 安全实践:
- 使用
snprintf
代替sprintf
防止缓冲区溢出 - 明确指定缓冲区大小
- 处理各种边界情况
- 使用