C 语言字符串转换
外观
C语言字符串转换是指将字符串与其他数据类型(如整数、浮点数)相互转换的过程,或在不同字符串编码格式(如ASCII与宽字符)间进行转换的操作。由于C语言中字符串本质是字符数组,这类转换需要特定的库函数和技巧。本条目将详细介绍常见的字符串转换方法及其应用场景。
基本概念[编辑 | 编辑源代码]
在C语言中,字符串是以空字符(\0
)结尾的字符数组。字符串转换通常涉及以下两类操作:
- 数据类型转换:字符串与数值类型(如
int
、double
)的相互转换 - 编码转换:不同字符编码(如ASCII与UTF-8)或字符宽度(如
char
与wchar_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
格式:
实现部分解码功能:
#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'
:
十六进制字符转换:
安全注意事项[编辑 | 编辑源代码]
- 使用
strtol()
而非atoi()
以检测转换错误 - 所有字符串操作应检查缓冲区边界
- 宽字符函数需要正确设置本地化环境