字符串相关函数

字符串相关函数(数值转字符串、字符串转数值)

一、字符串转数值函数

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;
}

运行结果
在这里插入图片描述

代码说明

这个示例包含以下特点:

  1. 封装的转换函数
    • str_to_int:字符串转整数,包含完整的错误处理
    • str_to_double:字符串转浮点数,处理各种错误情况
    • int_to_str:整数转字符串
    • double_to_str:浮点数转字符串,可指定精度
  2. 全面的错误处理
    • 检查范围错误(ERANGE)
    • 检查无效输入(无有效数字)
    • 检查整数溢出(超出 int 范围)
  3. 多样化转换示例
    • 基本整数转换
    • 带符号整数转换
    • 浮点数转换
    • 科学计数法转换
    • 错误输入处理
    • 多格式数值转字符串
  4. 安全实践
    • 使用snprintf代替sprintf防止缓冲区溢出
    • 明确指定缓冲区大小
    • 处理各种边界情况
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值