C语言字符串操作函数使用方法及示例代码详解

原创 2025-06-12 10:06:57编程技术
428

在C语言中,字符串以字符数组形式存在,以\0(空字符)结尾。标准库<string.h>提供了丰富的字符串操作函数,掌握这些函数是C语言编程的基础。本文ZHANID工具网将详细讲解常用字符串操作函数的使用方法及注意事项,并附上完整示例代码。

一、字符串基础操作函数

1. 计算字符串长度:strlen()

函数原型

size_t strlen(const char *str);

功能:返回字符串的实际长度(不包含结尾的\0)。

示例

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

int main() {
    char str[] = "Hello, World!";
    printf("Length: %zu\n", strlen(str));  // 输出 13
    return 0;
}

2. 字符串复制:strcpy()strncpy()

函数原型

char *strcpy(char *dest, const char *src);
char *strncpy(char *dest, const char *src, size_t n);

功能:将源字符串src复制到目标数组dest

区别

  • strcpy:复制直到遇到\0,不检查目标缓冲区大小(可能溢出)。

  • strncpy:最多复制n个字符,若src长度不足n,剩余空间填充\0

示例

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

int main() {
    char src[] = "Hello";
    char dest[10];
    
    // 安全复制:确保目标缓冲区足够大
    strcpy(dest, src);
    printf("strcpy: %s\n", dest);  // 输出 Hello
    
    // 限制复制长度
    strncpy(dest, src, 3);
    dest[3] = '\0';  // 手动添加结束符(strncpy不保证自动添加)
    printf("strncpy: %s\n", dest);  // 输出 Hel
    
    return 0;
}

3. 字符串连接:strcat()strncat()

函数原型

char *strcat(char *dest, const char *src);
char *strncat(char *dest, const char *src, size_t n);

功能:将src追加到dest末尾。

区别

  • strcat:不检查目标缓冲区大小(可能溢出)。

  • strncat:最多追加n个字符,并确保结果以\0结尾。

示例

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

int main() {
    char dest[20] = "Hello";
    char src[] = ", World!";
    
    strcat(dest, src);
    printf("strcat: %s\n", dest);  // 输出 Hello, World!
    
    strncat(dest, "!!!", 2);
    printf("strncat: %s\n", dest);  // 输出 Hello, World!!
    
    return 0;
}

二、字符串比较函数

1. 字典序比较:strcmp()strncmp()

函数原型

int strcmp(const char *s1, const char *s2);
int strncmp(const char *s1, const char *s2, size_t n);

返回值

  • <0s1 < s2

  • 0s1 == s2

  • >0s1 > s2

示例

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

int main() {
    char s1[] = "apple";
    char s2[] = "apples";
    
    printf("strcmp: %d\n", strcmp(s1, s2));     // 输出负数(s1 < s2)
    printf("strncmp: %d\n", strncmp(s1, s2, 5)); // 输出0(前5个字符相同)
    
    return 0;
}

三、字符串查找函数

1. 查找字符:strchr()strrchr()

函数原型

char *strchr(const char *str, int c);
char *strrchr(const char *str, int c);

功能

  • strchr:从左到右查找字符c首次出现的位置。

  • strrchr:从右到左查找字符c最后一次出现的位置。

示例

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

int main() {
    char str[] = "hello@example.com";
    char *pos = strchr(str, '@');
    if (pos) {
        printf("First '@' at: %s\n", pos);  // 输出 @example.com
    }
    
    pos = strrchr(str, 'e');
    if (pos) {
        printf("Last 'e' at: %s\n", pos);   // 输出 example.com
    }
    
    return 0;
}

2. 查找子串:strstr()

函数原型

char *strstr(const char *haystack, const char *needle);

功能:在haystack中查找子串needle首次出现的位置。

示例

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

int main() {
    char text[] = "C programming is fun";
    char *sub = strstr(text, "pro");
    if (sub) {
        printf("Substring found: %s\n", sub);  // 输出 programming is fun
    }
    return 0;
}

C语言.webp

四、内存操作相关函数

1. 内存复制:memcpy()

函数原型

void *memcpy(void *dest, const void *src, size_t n);

功能:复制n字节内存(不依赖\0,需确保目标缓冲区足够大)。

示例

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

int main() {
    char src[] = "Hello";
    char dest[10];
    memcpy(dest, src, strlen(src) + 1);  // 包含结尾的\0
    printf("memcpy: %s\n", dest);  // 输出 Hello
    return 0;
}

2. 内存清零:memset()

函数原型

void *memset(void *s, int c, size_t n);

功能:将内存的前n字节设置为字符c

示例

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

int main() {
    char buf[10];
    memset(buf, '*', sizeof(buf));
    buf[9] = '\0';  // 手动添加结束符
    printf("memset: %s\n", buf);  // 输出 *********
    return 0;
}

五、格式化输入/输出函数

1. 格式化字符串:sprintf()

函数原型

int sprintf(char *str, const char *format, ...);

功能:将格式化数据写入字符串。

示例

#include <stdio.h>

int main() {
    char buf[20];
    int num = 42;
    sprintf(buf, "Number: %d", num);
    printf("sprintf: %s\n", buf);  // 输出 Number: 42
    return 0;
}

2. 从字符串解析数据:sscanf()

函数原型

int sscanf(const char *str, const char *format, ...);

功能:从字符串中读取格式化数据。

示例

#include <stdio.h>

int main() {
    char str[] = "Alice 25";
    char name[20];
    int age;
    sscanf(str, "%s %d", name, &age);
    printf("sscanf: Name=%s, Age=%d\n", name, age);  // 输出 Name=Alice, Age=25
    return 0;
}

六、安全编程建议

  1. 缓冲区溢出防护

    • 优先使用带n的函数(如strncpystrncat)。

    • 确保目标缓冲区足够大,或使用动态内存分配。

  2. 字符串结尾符

    • 手动操作字符串时,确保以\0结尾。

  3. 避免修改字符串字面量

    char *str = "immutable";  // 错误:尝试修改会导致未定义行为
    char str[] = "mutable";    // 正确:可修改的副本

七、完整示例代码

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

int main() {
    // 字符串复制与连接
    char src[] = "Hello";
    char dest[20] = "World";
    
    strncpy(dest, src, strlen(src));  // 安全复制
    strncat(dest, "!", 1);            // 追加!
    printf("Result: %s\n", dest);     // 输出 Hello!
    
    // 字符串查找
    char *pos = strchr(dest, '!');
    if (pos) {
        printf("Found '!' at: %s\n", pos);  // 输出 !
    }
    
    // 内存操作
    char buf[10];
    memset(buf, 'A', sizeof(buf));
    buf[9] = '\0';
    printf("Memory: %s\n", buf);  // 输出 AAAAAAAAA
    
    return 0;
}

八、总结

C语言字符串操作的核心是理解字符数组和空字符\0的终止机制。通过合理使用标准库函数,可以高效安全地处理字符串。但需特别注意缓冲区溢出问题,优先选择带长度限制的函数(如strncpy),并在必要时手动添加结束符。掌握这些技巧将显著提升代码的健壮性。

C语言 字符串操作函数
THE END
战地网
频繁记录吧,生活的本意是开心

相关推荐

C语言中memset函数的用法及示例代码详解
在C语言编程中,内存操作是至关重要的一环。memset函数作为标准库中用于内存初始化的核心工具,能够高效地将指定内存区域设置为固定值。本文ZHANID工具网将深入解析memset的函...
2025-06-23 编程技术
622

C语言运算符优先级顺序表详解(从高到低)
在C语言中,运算符优先级决定了表达式中运算的执行顺序。理解优先级规则是编写正确代码的基础,尤其在处理复杂表达式时,优先级错误可能导致逻辑混乱或隐蔽的Bug。本文ZHANID...
2025-06-12 编程技术
1681

C语言实现猜拳游戏实例代码详解(人机对战)
本文ZHANID工具网将通过一个完整的猜拳游戏项目,详细讲解C语言核心语法在实际开发中的应用。游戏包含玩家VS电脑对战、胜负判断、循环匹配等功能,适合C语言初学者学习基础逻...
2025-06-04 编程技术
390

C语言中%d、%f、%p、%c、%s、%的作用及区别详解
在C语言中,格式说明符是printf、scanf等输入输出函数的核心组成部分,它们决定了数据如何被解析和呈现。本文ZHANID工具网将详细解析常见格式说明符的作用、使用场景及注意事...
2025-04-28 编程技术
1297

C语言中实现小写字母转大写字母的方法详解
在C语言编程中,经常需要对字符进行大小写转换。特别是在处理文本数据时,将小写字母转换为大写字母是一个常见的需求。本文将详细介绍如何在C语言中实现小写字母到大写字母的...
2025-04-25 编程技术
567

C语言编译器哪个好:8款常用的C语言编辑器对比测评
C语言以其高效、灵活和接近硬件的特性,成为众多开发者心中的经典。然而,要想在C语言的编程道路上顺畅前行,一款合适的编译器或集成开发环境(IDE)是必不可少的工具。本文ZHA...
2025-01-08 编程技术
2783