C语言字符串类型转换主要通过atoi(字符串转int)、atof(字符串转double)等函数实现数值转换,但需注意atoi无法区分转换失败与结果为0;推荐使用strtol/strtod配合endptr指针检查转换是否成功。字符串与格式化数值的转换则常用sprintf(数值转字符串)和sscanf(字符串转数值)完成,使用时需注意缓冲区安全问题。

在C语言中,字符串类型转换是编程中非常常见的操作,主要用于将字符串形式的数据转换为数值类型(整型、浮点型等)或进行不同字符串格式之间的转换。

一、字符串转整型

1. atoi()函数

将字符串转换为整型(int)

#include <stdlib.h>
int atoi(const char *nptr);
  • 功能:扫描字符串,跳过空白字符,直到遇到数字或正负号开始转换

  • 返回值:转换后的整数值;如果转换失败或字符串为空,返回0

  • 示例

    #include <stdio.h>
    #include <stdlib.h>
    
    int main() {
        char *str = "12345.67";
        int num = atoi(str);
        printf("转换后的整数: %d\n", num); // 输出: 12345
        return 0;
    }
    

2. atol()函数

将字符串转换为长整型(long)

#include <stdlib.h>
long atol(const char *nptr);
  • 功能:与atoi类似,但返回long类型

3. atoll()函数

将字符串转换为长整型(long long)

#include <stdlib.h>
long long atoll(const char *nptr);

4. strtol()函数

将字符串转换为长整型,并可指定进制

#include <stdlib.h>
long strtol(const char *nptr, char **endptr, int base);
  • 参数

    • nptr:要转换的字符串
    • endptr:指向转换后剩余字符串的指针(可为NULL)
    • base:转换的进制(2-36,10表示十进制)
  • 示例

    #include <stdio.h>
    #include <stdlib.h>
    
    int main() {
        char *str = "0x1A";
        char *endptr;
        long num = strtol(str, &endptr, 16); // 16表示十六进制
        printf("转换后的长整数: %ld\n", num); // 输出: 26
        return 0;
    }
    

二、字符串转浮点型

1. atof()函数

将字符串转换为双精度浮点数(double)

#include <stdlib.h>
double atof(const char *str);
  • 功能:与strtod(str, NULL)结果相同

  • 示例

    #include <stdio.h>
    #include <stdlib.h>
    
    int main() {
        char *str = "-100.23";
        double num = atof(str);
        printf("转换后的浮点数: %.2f\n", num); // 输出: -100.23
        return 0;
    }
    

2. strtod()函数

将字符串转换为双精度浮点数,并可获取转换后剩余字符串

#include <stdlib.h>
double strtod(const char *nptr, char **endptr);
  • 示例

    #include <stdio.h>
    #include <stdlib.h>
    
    int main() {
        char *str = "123.456abc";
        char *endptr;
        double num = strtod(str, &endptr);
        printf("转换后的浮点数: %f\n", num); // 输出: 123.456000
        printf("剩余字符串: %s\n", endptr);   // 输出: abc
        return 0;
    }
    

3. strtof()strtold()

  • strtof():将字符串转换为float
  • strtold():将字符串转换为long double

三、其他常用字符串转换

1. sprintf()sscanf()

用于格式化字符串的转换

#include <stdio.h>

int main() {
    // 整型转字符串
    char str[20];
    int num = 123;
    sprintf(str, "%d", num);
    printf("整型转字符串: %s\n", str); // 输出: 123
    
    // 字符串转整型
    int num2;
    sscanf(str, "%d", &num2);
    printf("字符串转整型: %d\n", num2); // 输出: 123
    return 0;
}

2. 字符串与字符数组的转换

  • strcpy():复制字符串
  • strcat():连接字符串
  • strlen():获取字符串长度

四、注意事项

  1. 转换失败处理atoi()等函数在转换失败时返回0,无法区分是转换为0还是转换失败。建议使用strtol()等函数,通过检查endptr来判断转换是否成功。

  2. 字符串格式:转换函数通常只处理有效的数字格式,如"123.45""-100""0x1A"等。无效格式会导致转换失败。

  3. 字符编码:C语言字符串默认是ASCII编码,处理中文等多字节字符需要额外处理。

  4. 安全问题:在使用strcpy()等函数时,要特别注意缓冲区溢出问题,建议使用strncpy()等更安全的函数。

五、示例:字符串转换综合应用

#include <stdio.h>
#include <stdlib.h>

int main() {
    // 字符串转整型
    char *str1 = "12345";
    int num1 = atoi(str1);
    printf("字符串 '%s' 转换为整型: %d\n", str1, num1);
    
    // 字符串转浮点型
    char *str2 = "3.14159";
    double num2 = atof(str2);
    printf("字符串 '%s' 转换为浮点型: %.5f\n", str2, num2);
    
    // 字符串转长整型
    char *str3 = "1234567890123";
    char *endptr;
    long num3 = strtol(str3, &endptr, 10);
    printf("字符串 '%s' 转换为长整型: %ld\n", str3, num3);
    
    // 验证转换是否成功
    if (*endptr != '\0') {
        printf("转换后还有剩余字符串: %s\n", endptr);
    }
    
    return 0;
}

根据不同的需求,可以选择合适的转换函数来实现字符串与数值类型之间的转换。