c语言字符串操作示例

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 的执行流程如下:

  1. 引入头文件 stdio.hstring.h
  2. 声明并初始化字符串 str1str2
  3. 使用 strcat() 函数连接 str1str2
  4. 使用 strlen() 函数计算字符串长度
  5. 使用 strcmp() 函数比较字符串
  6. 使用 strcpy() 函数复制字符串
  7. 使用 strncpy() 函数进行安全的字符串复制
  8. 使用 strchr() 函数查找字符
  9. 使用 strstr() 函数查找子字符串
  10. 手动实现字符串大小写转换
  11. 程序结束

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 编码。您可以通过以下方式解决:

  1. 使用 chcp 65001 命令将控制台编码设置为 UTF-8
  2. 或者使用 setlocal EnableDelayedExpansionchcp 936 命令将控制台编码设置为 GBK,同时在编译时使用 -fexec-charset=GBK 参数
bash 复制代码
setlocal EnableDelayedExpansion
chcp 936
gcc -fexec-charset=GBK strings.c -o strings

9. 总结

strings.c 提供了 C 语言中字符串操作的基本示例,涵盖了字符串的声明、初始化、连接、比较、复制、查找和大小写转换等核心操作。通过学习这些示例,您可以掌握 C 语言中字符串处理的基础知识。

此外,我们还补充了字符串分割、反转、替换和字符串转数字等高级操作的示例函数,帮助您进一步扩展对 C 语言字符串处理的理解。

在实际编程中,建议您始终使用安全的字符串操作函数,并注意处理可能的边界情况,以避免缓冲区溢出等安全问题。

相关推荐
Damon_X2 小时前
extern “C“
c语言
GoWjw3 小时前
在C&C++指针的惯用方法
c语言·开发语言·c++
Coding Peasant3 小时前
GD32E230 I2C从机功能深度解析与实现指南
c语言·stm32·单片机·mcu·arm
superman超哥3 小时前
仓颉语言中错误恢复策略的深度剖析与工程实践
c语言·开发语言·c++·python·仓颉
玖剹3 小时前
记忆化搜索题目(二)
c语言·c++·算法·leetcode·深度优先·剪枝·深度优先遍历
搬砖的kk4 小时前
Lycium++ - OpenHarmony PC C/C++ 增强编译框架
c语言·开发语言·c++
fantasy_arch5 小时前
pd_process.c 文件源码分析
c语言·数据库·视频编解码·av1
黎雁·泠崖9 小时前
C 语言指针进阶教程:const 修饰、野指针规避与传址调用
c语言·开发语言
历程里程碑10 小时前
C++ 17异常处理:高效捕获与精准修复
java·c语言·开发语言·jvm·c++