
strings.c 完整代码
c
#include <stdio.h>
#include <string.h>
int main() {
char str1[20] = "Hello";
char str2[] = " World";
// 字符串连接
strcat(str1, str2);
printf("连接后: %s\n", str1);
// 字符串长度
printf("长度: %d\n", strlen(str1));
// 字符串比较
if (strcmp(str1, "Hello World") == 0) {
printf("字符串匹配\n");
}
// 字符串复制
char str3[20];
strcpy(str3, str1);
printf("复制后: %s\n", str3);
// 安全的字符串复制(限制长度)
char str4[10];
strncpy(str4, str1, sizeof(str4) - 1);
str4[sizeof(str4) - 1] = '\0'; // 确保字符串结束
printf("安全复制后: %s\n", str4);
// 查找字符
char *ptr = strchr(str1, 'W');
if (ptr != NULL) {
printf("找到字符 'W' 在位置: %d\n", ptr - str1);
}
// 查找子字符串
ptr = strstr(str1, "World");
if (ptr != NULL) {
printf("找到子字符串 'World' 在位置: %d\n", ptr - str1);
}
// 字符串大小写转换(手动实现)
char str5[] = "Hello World";
printf("原始字符串: %s\n", str5);
printf("转为大写: ");
for (int i = 0; str5[i] != '\0'; i++) {
if (str5[i] >= 'a' && str5[i] <= 'z') {
printf("%c", str5[i] - 32);
} else {
printf("%c", str5[i]);
}
}
printf("\n");
return 0;
}
1. 文件概述
strings.c 是一个展示 C 语言中字符串基本操作和常用字符串处理函数的示例文件。通过该文件,您可以学习 C 语言中字符串的声明、初始化、连接、比较、复制、查找以及大小写转换等核心操作。
- 文件名: strings.c
- 类型: C语言源文件
- 功能: 演示C语言中字符串的基本操作和常用字符串处理函数
- 依赖: 标准C库(stdio.h, string.h)
2. 核心结构
2.1 头文件包含
strings.c 首先包含了两个必要的头文件:
c
#include <stdio.h> // 引入标准输入输出库
#include <string.h> // 引入字符串处理函数库
2.2 主函数(程序入口)
程序的核心逻辑在 main() 函数中实现,该函数演示了各种字符串操作并输出结果:
c
int main() {
char str1[20] = "Hello"; // 目标字符串数组(用于字符串连接)
char str2[] = " World"; // 源字符串数组(用于字符串连接)
char str3[20]; // 目标字符串数组(用于字符串复制)
char str4[10]; // 目标字符串数组(用于安全字符串复制)
char str5[] = "Hello World"; // 目标字符串数组(用于大小写转换)
char *ptr; // 字符指针(用于字符串查找)
// 各种字符串操作...
return 0;
}
3. 关键概念与实现
3.1 字符串的声明与初始化
C 语言中字符串可以通过以下两种方式声明和初始化:
c
char str1[20] = "Hello"; // 固定长度声明:指定数组大小为20
char str2[] = " World"; // 自动长度声明:根据字符串长度自动分配大小
3.2 字符串连接
使用 strcat() 函数将一个字符串连接到另一个字符串的末尾:
c
// 字符串连接
strcat(str1, str2);
printf("连接后: %s\n", str1);
注意事项:目标字符串必须有足够的空间容纳连接后的结果,否则会导致缓冲区溢出。
3.3 字符串长度
使用 strlen() 函数获取字符串的长度(不包括结束符 '\0'):
c
// 字符串长度
printf("长度: %d\n", strlen(str1));
3.4 字符串比较
使用 strcmp() 函数比较两个字符串是否相等:
c
// 字符串比较
if (strcmp(str1, "Hello World") == 0) {
printf("字符串匹配\n");
}
返回值说明:
- 0: 字符串相等
- 正数: str1 大于 str2
- 负数: str1 小于 str2
3.5 字符串复制
使用 strcpy() 函数将一个字符串复制到另一个字符串:
c
// 字符串复制
char str3[20];
strcpy(str3, str1);
printf("复制后: %s\n", str3);
3.6 安全的字符串复制
使用 strncpy() 函数进行安全的字符串复制,可以限制复制的长度:
c
// 安全的字符串复制(限制长度)
char str4[10];
strncpy(str4, str1, sizeof(str4) - 1);
str4[sizeof(str4) - 1] = '\0'; // 确保字符串结束
printf("安全复制后: %s\n", str4);
注意事项 :使用 strncpy() 时,需要手动添加结束符 '\0',以确保字符串的完整性。
3.7 字符查找
使用 strchr() 函数在字符串中查找特定字符的第一次出现:
c
// 查找字符
char *ptr = strchr(str1, 'W');
if (ptr != NULL) {
printf("找到字符 'W' 在位置: %d\n", ptr - str1);
}
返回值说明 :找到时返回指向该字符的指针,否则返回 NULL。
3.8 子字符串查找
使用 strstr() 函数在字符串中查找子字符串的第一次出现:
c
// 查找子字符串
ptr = strstr(str1, "World");
if (ptr != NULL) {
printf("找到子字符串 'World' 在位置: %d\n", ptr - str1);
}
返回值说明 :找到时返回指向该子字符串的指针,否则返回 NULL。
3.9 字符串大小写转换
通过手动修改 ASCII 码实现字符串的大小写转换:
c
// 字符串大小写转换(手动实现)
char str5[] = "Hello World";
printf("原始字符串: %s\n", str5);
printf("转为大写: ");
for (int i = 0; str5[i] != '\0'; i++) {
if (str5[i] >= 'a' && str5[i] <= 'z') {
printf("%c", str5[i] - 32); // 小写转大写
} else {
printf("%c", str5[i]); // 其他字符保持不变
}
}
printf("\n");
4. 代码流程
strings.c 的执行流程如下:
- 引入头文件
stdio.h和string.h - 声明并初始化字符串
str1和str2 - 使用
strcat()函数连接str1和str2 - 使用
strlen()函数计算字符串长度 - 使用
strcmp()函数比较字符串 - 使用
strcpy()函数复制字符串 - 使用
strncpy()函数进行安全的字符串复制 - 使用
strchr()函数查找字符 - 使用
strstr()函数查找子字符串 - 手动实现字符串大小写转换
- 程序结束
5. 输出结果
编译并运行 strings.c 后,将得到以下输出:
连接后: Hello World
长度: 11
字符串匹配
复制后: Hello World
安全复制后: Hello Wo
找到字符 'W' 在位置: 6
找到子字符串 'World' 在位置: 6
原始字符串: Hello World
转为大写: HELLO WORLD
6. 补充代码示例
6.1 字符串分割
以下是一个将字符串按指定分隔符分割的示例函数:
c
#include <stdio.h>
#include <string.h>
void split_string(char *str, const char *delimiter) {
char *token = strtok(str, delimiter);
while (token != NULL) {
printf("%s\n", token);
token = strtok(NULL, delimiter);
}
}
// 使用示例:
// char str[] = "apple,banana,cherry";
// split_string(str, ",");
6.2 字符串反转
以下是一个反转字符串的示例函数:
c
#include <stdio.h>
#include <string.h>
void reverse_string(char *str) {
int length = strlen(str);
int start = 0;
int end = length - 1;
while (start < end) {
char temp = str[start];
str[start] = str[end];
str[end] = temp;
start++;
end--;
}
}
// 使用示例:
// char str[] = "Hello";
// reverse_string(str);
// printf("%s\n", str); // 输出:olleH
6.3 字符串替换
以下是一个替换字符串中指定子串的示例函数:
c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char* replace_string(char *str, const char *old, const char *new) {
char *result;
int i, count = 0;
int old_len = strlen(old);
int new_len = strlen(new);
// 计算需要替换的次数
for (i = 0; str[i] != '\0'; i++) {
if (strstr(&str[i], old) == &str[i]) {
count++;
i += old_len - 1;
}
}
// 分配结果字符串的内存
result = (char *)malloc(i + count * (new_len - old_len) + 1);
i = 0;
while (*str) {
// 找到匹配项
if (strstr(str, old) == str) {
strcpy(&result[i], new);
i += new_len;
str += old_len;
} else {
result[i++] = *str++;
}
}
result[i] = '\0';
return result;
}
// 使用示例:
// char str[] = "Hello World";
// char *result = replace_string(str, "World", "C Language");
// printf("%s\n", result); // 输出:Hello C Language
// free(result); // 释放内存
6.4 字符串转数字
以下是将字符串转换为不同类型数字的示例:
c
#include <stdio.h>
#include <stdlib.h>
int main() {
char str_int[] = "12345";
char str_float[] = "3.14159";
char str_long[] = "9876543210";
int num_int = atoi(str_int); // 字符串转整数
float num_float = atof(str_float); // 字符串转浮点数
long num_long = atol(str_long); // 字符串转长整数
printf("整数: %d\n", num_int);
printf("浮点数: %f\n", num_float);
printf("长整数: %ld\n", num_long);
return 0;
}
7. 编译和运行
7.1 使用 GCC 编译
在命令行中,可以使用以下命令编译 strings.c:
bash
gcc strings.c -o strings -fexec-charset=gbk
7.2 运行程序
编译成功后,根据您的操作系统,使用以下命令运行程序:
-
Windows:
bash.\strings.exe -
Linux/macOS:
bash./strings
8. 注意事项
8.1 字符串缓冲区溢出
在 C 语言中,字符串操作需要特别注意缓冲区溢出问题。使用 strcat() 和 strcpy() 等函数时,必须确保目标字符串有足够的空间容纳结果。建议使用 strncat() 和 strncpy() 等安全版本的函数。
8.2 字符串结束符
C 语言中的字符串以 '\0' 字符结束。在进行字符串操作时,必须确保字符串正确终止,否则可能导致未定义行为。
8.3 字符编码
在 Windows 环境下,如果程序输出包含中文,可能会出现乱码问题。这是因为 Windows 控制台默认使用 GBK 编码,而 GCC 编译时默认使用 UTF-8 编码。您可以通过以下方式解决:
- 使用
chcp 65001命令将控制台编码设置为 UTF-8 - 或者使用
setlocal EnableDelayedExpansion和chcp 936命令将控制台编码设置为 GBK,同时在编译时使用-fexec-charset=GBK参数
bash
setlocal EnableDelayedExpansion
chcp 936
gcc -fexec-charset=GBK strings.c -o strings
9. 总结
strings.c 提供了 C 语言中字符串操作的基本示例,涵盖了字符串的声明、初始化、连接、比较、复制、查找和大小写转换等核心操作。通过学习这些示例,您可以掌握 C 语言中字符串处理的基础知识。
此外,我们还补充了字符串分割、反转、替换和字符串转数字等高级操作的示例函数,帮助您进一步扩展对 C 语言字符串处理的理解。
在实际编程中,建议您始终使用安全的字符串操作函数,并注意处理可能的边界情况,以避免缓冲区溢出等安全问题。