字符串相关函数
字符串相关函数(数值转字符串、字符串转数值)
一、字符串转数值函数
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
防止缓冲区溢出 - 明确指定缓冲区大小
- 处理各种边界情况
- 使用