问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

从strlen()开始,掌握C语言字符串操作技巧

创作时间:
作者:
@小白创作中心

从strlen()开始,掌握C语言字符串操作技巧

引用
CSDN
7
来源
1.
https://blog.csdn.net/weixin_65931202/article/details/133608862
2.
https://blog.csdn.net/qq_29924041/article/details/54351384
3.
https://blog.csdn.net/zhaoxaun666/article/details/78586333
4.
https://my.oschina.net/emacs_8757573/blog/17192466
5.
https://docs.oldtimes.me/c.biancheng.net/cpp/html/2796.html
6.
https://developer.aliyun.com/article/244077
7.
https://www.cnblogs.com/dongxb/p/14193268.html

在C语言中,字符串操作是程序开发中不可或缺的一部分。从简单的字符串长度计算到复杂的字符串处理,掌握这些基本技能对于编写高效、安全的代码至关重要。本文将从strlen()函数入手,逐步深入讲解C语言中常用的字符串操作技巧。

01

strlen()函数详解

strlen()是C语言中用于计算字符串长度的标准库函数。其函数原型如下:

size_t strlen(const char *str);
  • 参数:指向字符串的指针
  • 返回值:字符串的长度(不包括结尾的'\0')

实现原理

strlen()通过遍历字符串中的每个字符,直到遇到空字符'\0'为止。具体步骤如下:

  1. 声明一个计数器变量count并初始化为0
  2. 从字符串的第一个字符开始检查
  3. 如果当前字符不为空字符'\0',则count加1
  4. 继续检查下一个字符,直到遇到'\0'
  5. 返回count作为字符串的长度

使用示例

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

int main() {
    const char *str = "Hello, World!";
    size_t length = strlen(str);
    printf("字符串长度: %zu\n", length);
    return 0;
}

注意事项

  • strlen()只能用于计算以'\0'结尾的字符串长度
  • 如果字符串没有以'\0'结尾,结果将是未定义的
  • 返回值是size_t类型,是一个无符号整数
02

常用字符串操作函数

除了strlen(),C语言还提供了许多其他字符串操作函数,它们都定义在<string.h>头文件中。

strcpy():字符串拷贝

用于将一个字符串复制到另一个字符串中。

char *strcpy(char *dest, const char *src);
  • 参数:dest是目标字符串,src是源字符串
  • 返回值:指向目标字符串的指针

示例

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

int main() {
    char src[] = "Hello";
    char dest[50];
    strcpy(dest, src);
    printf("拷贝后的字符串: %s\n", dest);
    return 0;
}

注意事项

  • 目标字符串必须有足够的空间来存储源字符串
  • strcpy()不会检查目标空间大小,可能导致缓冲区溢出
  • 建议使用strncpy()进行安全拷贝

strcat():字符串连接

用于将一个字符串连接到另一个字符串的末尾。

char *strcat(char *dest, const char *src);
  • 参数:dest是目标字符串,src是源字符串
  • 返回值:指向目标字符串的指针

示例

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

int main() {
    char str1[50] = "Hello, ";
    char str2[] = "World!";
    strcat(str1, str2);
    printf("连接后的字符串: %s\n", str1);
    return 0;
}

注意事项

  • 目标字符串必须有足够的空间来容纳连接后的字符串
  • strcat()不会检查目标空间大小,可能导致缓冲区溢出

strcmp():字符串比较

用于比较两个字符串。

int strcmp(const char *str1, const char *str2);
  • 参数:str1和str2是要比较的两个字符串
  • 返回值
    • 0:两个字符串相等
    • 0:str1大于str2

    • <0:str1小于str2

示例

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

int main() {
    char str1[] = "apple";
    char str2[] = "banana";
    int result = strcmp(str1, str2);
    if (result == 0) {
        printf("两个字符串相等\n");
    } else if (result > 0) {
        printf("str1大于str2\n");
    } else {
        printf("str1小于str2\n");
    }
    return 0;
}

strchr():查找字符

用于查找字符在字符串中首次出现的位置。

char *strchr(const char *str, int c);
  • 参数:str是待搜索的字符串,c是要查找的字符
  • 返回值:指向字符的指针,如果未找到则返回NULL

示例

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

int main() {
    char str[] = "Hello, World!";
    char *pos = strchr(str, 'o');
    if (pos != NULL) {
        printf("字符'o'首次出现在位置: %ld\n", pos - str);
    } else {
        printf("未找到字符'o'\n");
    }
    return 0;
}
03

字符串处理技巧

字符串初始化与赋值

  • 初始化:在声明时直接赋值

    char greeting[] = "Hello, World!";
    
  • 赋值:使用strcpy()函数

    char dest[50];
    strcpy(dest, "Hello, C Programmer!");
    

动态内存分配

当字符串长度未知或需要动态变化时,可以使用malloc()或calloc()进行动态分配。

char *dynamicStr = (char *)malloc(100 * sizeof(char));
if (dynamicStr != NULL) {
    strcpy(dynamicStr, "Dynamically allocated string.");
}

注意事项

  • 使用完动态分配的内存后,记得用free()释放
  • 动态分配时要确保分配足够的空间

安全的字符串拷贝

strcpy()存在缓冲区溢出的风险,建议使用strncpy()。

char source[] = "Safe copy.";
char destination[20];
strncpy(destination, source, sizeof(destination) - 1);
destination[sizeof(destination) - 1] = '\0';

字符串拼接与分割

  • 拼接:使用strcat()或strncat()
  • 分割:使用strtok()

示例:字符串拼接

char str1[50] = "Hello, ";
char str2[] = "World!";
strcat(str1, str2);
printf("拼接后的字符串: %s\n", str1);

示例:字符串分割

char str[] = "apple,banana,cherry";
char *token = strtok(str, ",");
while (token != NULL) {
    printf("%s\n", token);
    token = strtok(NULL, ",");
}

通过掌握这些基本的字符串操作函数和技巧,你可以更高效地处理C语言中的字符串数据。在实际开发中,务必注意字符串操作的安全性,避免缓冲区溢出等常见问题。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号