跳转到内容

C 语言字符串转换

来自代码酷


C语言字符串转换是指将字符串与其他数据类型(如整数、浮点数)相互转换的过程,或在不同字符串编码格式(如ASCII与宽字符)间进行转换的操作。由于C语言中字符串本质是字符数组,这类转换需要特定的库函数和技巧。本条目将详细介绍常见的字符串转换方法及其应用场景。

基本概念[编辑 | 编辑源代码]

在C语言中,字符串是以空字符(\0)结尾的字符数组。字符串转换通常涉及以下两类操作:

  1. 数据类型转换:字符串与数值类型(如intdouble)的相互转换
  2. 编码转换:不同字符编码(如ASCII与UTF-8)或字符宽度(如charwchar_t)间的转换

字符串与数值转换[编辑 | 编辑源代码]

字符串转数值[编辑 | 编辑源代码]

C标准库提供以下函数(需包含头文件<stdlib.h>):

  • atoi():字符串转int
  • atof():字符串转double
  • strtol():字符串转long(可指定进制)
#include <stdio.h>
#include <stdlib.h>

int main() {
    char str_int[] = "12345";
    char str_float[] = "3.1415";
    
    int num_int = atoi(str_int);
    double num_float = atof(str_float);
    
    printf("整数: %d\n浮点数: %f\n", num_int, num_float);
    return 0;
}

输出:

整数: 12345
浮点数: 3.141500

更安全的替代方案(C11起):

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

int main() {
    char str[] = "42 apples";
    char *endptr;
    long num = strtol(str, &endptr, 10);
    
    printf("数值: %ld\n剩余字符串: '%s'\n", num, endptr);
    return 0;
}

输出:

数值: 42
剩余字符串: ' apples'

数值转字符串[编辑 | 编辑源代码]

常用方法:

  • sprintf():格式化输出到字符串
  • snprintf():安全版本(指定缓冲区大小)
#include <stdio.h>

int main() {
    char buffer[50];
    int num = 255;
    
    snprintf(buffer, sizeof(buffer), "十进制: %d, 十六进制: 0x%X", num, num);
    puts(buffer);
    return 0;
}

输出:

十进制: 255, 十六进制: 0xFF

字符编码转换[编辑 | 编辑源代码]

窄字符与宽字符转换[编辑 | 编辑源代码]

需包含头文件<wchar.h><locale.h>

#include <stdio.h>
#include <wchar.h>
#include <locale.h>

int main() {
    setlocale(LC_ALL, ""); // 设置本地化环境
    
    char narrow_str[] = "你好, 世界!";
    wchar_t wide_str[50];
    
    // 窄字符转宽字符
    mbstowcs(wide_str, narrow_str, sizeof(wide_str)/sizeof(wchar_t));
    wprintf(L"宽字符: %ls\n", wide_str);
    
    return 0;
}

输出:

宽字符: 你好, 世界!

大小写转换[编辑 | 编辑源代码]

使用<ctype.h>中的函数:

#include <stdio.h>
#include <ctype.h>

void str_toupper(char *str) {
    for (; *str; ++str) *str = toupper((unsigned char)*str);
}

int main() {
    char text[] = "Case Conversion Example";
    str_toupper(text);
    puts(text);
    return 0;
}

输出:

CASE CONVERSION EXAMPLE

实际应用案例[编辑 | 编辑源代码]

案例1:配置文件解析[编辑 | 编辑源代码]

解析键值对格式的配置文件(如port=8080):

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

void parse_config(const char *line) {
    char key[50], value[50];
    if (sscanf(line, "%49[^=]=%49s", key, value) == 2) {
        if (strcmp(key, "port") == 0) {
            int port = atoi(value);
            printf("配置端口: %d\n", port);
        }
    }
}

int main() {
    parse_config("port=8080");
    return 0;
}

案例2:URL编码解码[编辑 | 编辑源代码]

URL编码将特殊字符转换为%XX格式:

graph LR A[原始字符 'A'] -->|ASCII 65| B[十六进制 41] B --> C[URL编码 '%41']

实现部分解码功能:

#include <stdio.h>
#include <ctype.h>

void url_decode(char *dst, const char *src) {
    char a, b;
    while (*src) {
        if (*src == '%' && 
            isxdigit(a = src[1]) && 
            isxdigit(b = src[2])) {
            *dst++ = (a - (isdigit(a) ? '0' : 'A'-10)) * 16 + 
                      (b - (isdigit(b) ? '0' : 'A'-10));
            src += 3;
        } else {
            *dst++ = *src++;
        }
    }
    *dst = '\0';
}

int main() {
    char encoded[] = "Hello%20World%21";
    char decoded[50];
    url_decode(decoded, encoded);
    puts(decoded);
    return 0;
}

输出:

Hello World!

数学公式示例[编辑 | 编辑源代码]

ASCII字符转换数值的数学表达: 对于数字字符'0''9'value=char0

十六进制字符转换: value={char0如果 char[0,9]10+(charA)如果 char[A,F]10+(chara)如果 char[a,f]

安全注意事项[编辑 | 编辑源代码]

  • 使用strtol()而非atoi()以检测转换错误
  • 所有字符串操作应检查缓冲区边界
  • 宽字符函数需要正确设置本地化环境