当前位置: 首页 > article >正文

C语言精粹:深入探索字符串函数

大家好,这里是小编的博客频道
小编的博客:就爱学编程

很高兴在CSDN这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!!

本文目录

  • 引言
  • 正文
    • (1)常见字符串函数
      • 1. strlen - 计算字符串长度
      • 2. strcpy - 复制字符串
      • 3. strcat - 连接字符串
      • 4. strcmp - 比较字符串
    • (2)非常见字符串函数
      • 1. strstr()
      • 2. sscanf()
      • 3. strchr()
      • 4. strncat()
      • 5. strncmp()
      • 6.strtok 函数使用介绍
        • 函数原型
        • 返回值
        • 使用示例
        • 输出结果
        • 注意事项
  • 快乐的时光总是短暂,咱们下篇博文再见啦!!!不要忘了,给小编点点赞和收藏支持一下,在此非常感谢!!!

引言

在C语言中,字符串是以字符数组的形式表示的,并以空字符('\0')作为结束标志。标准库提供了一系列用于处理字符串的函数,这些函数定义在头文件 <string.h> 中。下面是一些常用的字符串函数及其模拟实现,一起来看看吧。

在这里插入图片描述


那接下来就让我们开始遨游在知识的海洋!

正文


在C语言中,字符串是以字符数组的形式表示的,并以空字符('\0')作为结束标志。标准库提供了一系列用于处理字符串的函数,这些函数定义在头文件 <string.h> 中。下面是一些常用的字符串函数及其模拟实现:

(1)常见字符串函数


1. strlen - 计算字符串长度

功能: 返回字符串的长度(不包括终止的空字符)。

原型: size_t strlen(const char *str);

模拟实现:

#include <stdio.h>

size_t my_strlen(const char *str) {
    const char *s = str;
    while (*s != '\0') {
        ++s;
    }
    return s - str;
}

int main() {
    char str[] = "Hello, World!";
    printf("Length of '%s' is %zu
", str, my_strlen(str));
    return 0;
}

2. strcpy - 复制字符串

功能: 将源字符串复制到目标字符串中。

原型: char *strcpy(char *dest, const char *src);

模拟实现:

#include <stdio.h>

char* my_strcpy(char *dest, const char *src) {
    char *d = dest;
    while ((*d++ = *src++) != '\0');
    return dest;
}

int main() {
    char src[] = "Hello, Copy!";
    char dest[50];  // 确保目标数组有足够的空间
    my_strcpy(dest, src);
    printf("Copied string: %s
", dest);
    return 0;
}

3. strcat - 连接字符串

功能: 将源字符串连接到目标字符串的末尾。

原型: char *strcat(char *dest, const char *src);

模拟实现:

#include <stdio.h>

char* my_strcat(char *dest, const char *src) {
    char *d = dest;
    while (*d != '\0') {
        d++;
    }
    while ((*d++ = *src++) != '\0');
    return dest;
}

int main() {
    char str1[50] = "Hello, ";
    char str2[] = "World!";
    my_strcat(str1, str2);
    printf("Concatenated string: %s
", str1);
    return 0;
}

4. strcmp - 比较字符串

功能: 按字典顺序比较两个字符串。

原型: int strcmp(const char *str1, const char *str2);

  • 如果返回值小于0,表示 str1 小于 str2
  • 如果返回值等于0,表示 str1 等于 str2
  • 如果返回值大于0,表示 str1 大于 str2

模拟实现:

#include <stdio.h>

int my_strcmp(const char *str1, const char *str2) {
    while (*str1 && (*str1 == *str2)) {
        str1++;
        str2++;
    }
    return *(unsigned char *)str1 - *(unsigned char *)str2;
}

int main() {
    char str1[] = "apple";
    char str2[] = "Apple";
    int result = my_strcmp(str1, str2);
    if (result < 0) {
        printf("%s is less than %s
", str1, str2);
    } else if (result > 0) {
        printf("%s is greater than %s
", str1, str2);
    } else {
        printf("%s is equal to %s
", str1, str2);
    }
    return 0;
}
  • 这些是C语言中最常用的一些字符串处理函数的简单实现示例。在实际开发中,建议使用标准库提供的函数,因为它们经过优化且更加可靠。不过,了解这些函数的内部工作原理有助于更好地理解字符串处理的细节和潜在问题。

在C语言中,字符串处理是一个常见的任务,而标准库提供了一系列函数来简化这些操作。尽管像strlenstrcmpstrcpy这样的函数广为人知且频繁使用,但还有一些不那么常见但仍然非常有用的字符串函数。以下是对一些不常见的C语言字符串函数的介绍和使用示例:

(2)非常见字符串函数

1. strstr()

功能:检索子串在字符串中首次出现的位置。

头文件<string.h>

用法char *strstr(char *str, char *substr);

  • str:要检索的字符串。
  • substr:要检索的子串。

返回值:返回字符串str中第一次出现子串substr的地址;如果没有找到子串,则返回NULL

示例

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

int main() {
    char a[] = "abcdefg";
    char b[] = "bc";
    char *ret = strstr(a, b);
    if (ret == NULL) {
        printf("Can not find!
");
    } else {
        printf("%s
", ret); // 输出 bcdefg
    }
    return 0;
}

2. sscanf()

功能:从字符串读取格式化输入。

头文件<stdio.h>

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

  • str:输入的字符串。
  • format:格式字符串,指定后续参数的类型和如何解释输入字符串。

返回值:成功转换并赋值的项数;如果到达文件末尾或发生读错误,则返回一个负值。

示例

#include <stdio.h>

int main() {
    char buf[512] = {0};
    sscanf("123456", "%s", buf);
    printf("%s
", buf); // 输出 123456
    return 0;
}

3. strchr()

功能:查找字符串中首次出现的字符。

头文件<string.h>

用法char *strchr(char *str, char ch);

  • str:要搜索的字符串。
  • ch:要查找的字符。

返回值:返回指向首次出现字符ch的位置的指针;如果未找到该字符,则返回NULL

示例

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

int main() {
    char str[] = "Hello, World!";
    char ch = 'W';
    char *pos = strchr(str, ch);
    if (pos != NULL) {
        printf("Character '%c' found at position: %ld
", ch, pos - str);
    } else {
        printf("Character '%c' not found.
", ch);
    }
    return 0;
}

4. strncat()

功能:连接两个字符串,最多复制n个字符。

头文件<string.h>

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

  • dest:目标字符串。
  • src:源字符串。
  • n:要从src复制到dest的最大字符数。

返回值:返回目标字符串dest的指针。

注意事项:确保目标字符串有足够的空间来容纳连接后的结果。

示例

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

int main() {
    char dest[20] = "Hello, ";
    char src[] = "World!!!";
    strncat(dest, src, 5); // 只连接前5个字符
    printf("%s
", dest); // 输出 Hello, World
    return 0;
}

5. strncmp()

功能:比较两个字符串的前n个字符。

头文件<string.h>

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

  • s1, s2:要比较的字符串。
  • n:要比较的字符数。

返回值:小于0表示s1小于s2;等于0表示两者相等(在前n个字符内);大于0表示s1大于s2

示例

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

int main() {
    char str1[] = "Apple";
    char str2[] = "Banana";
    int result = strncmp(str1, str2, 4); // 比较前4个字符
    if (result < 0) {
        printf("str1 is less than str2 in the first 4 characters.
");
    } else if (result > 0) {
        printf("str1 is greater than str2 in the first 4 characters.
");
    } else {
        printf("The first 4 characters of str1 and str2 are equal.
");
    }
    return 0;
}

6.strtok 函数使用介绍

strtok 是 C 标准库中的一个字符串处理函数,用于将字符串分割成一系列的“标记”(tokens)。这个函数在处理和分析以特定分隔符(delimiter)分隔的字符串时非常有用。例如,解析 CSV 文件、命令行参数或任何需要按特定字符分割的文本数据。

函数原型
char *strtok(char *str, const char *delim);
char *strtok_r(char *str, const char *delim, char **saveptr); // 线程安全版本,POSIX标准
  • str: 要分割的字符串。首次调用时传入要处理的字符串;后续调用应传入 NULL 以继续从上次停止的地方开始分割。
  • delim: 包含所有用作分隔符的字符集合。
  • saveptr (仅在 strtok_r 中): 一个指向 char* 的指针,用于保存状态信息以便在多次调用之间保持连续性(线程安全)。
返回值
  • 成功时返回指向下一个标记的指针。
  • 没有更多标记可提取时返回 NULL。
使用示例

以下是一个简单的例子,演示如何使用 strtok 来分割一个包含逗号分隔值的字符串:

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

int main() {
    char str[] = "apple,banana,cherry,date";
    const char delim[2] = ",";
    char *token;

    // 获取第一个标记
    token = strtok(str, delim);

    // 循环获取后续的标记,直到没有更多的标记为止
    while (token != NULL) {
        printf("Token: %s
", token);
        token = strtok(NULL, delim);  // 注意这里传入的是 NULL
    }

    return 0;
}
输出结果
Token: apple
Token: banana
Token: cherry
Token: date
注意事项
  1. 修改原字符串strtok 会修改传入的原始字符串,用空字符 ('\0') 替换分隔符。因此,如果需要保留原始字符串,应在调用 strtok 之前对其进行复制。
  1. 不可重入和线程安全性:标准的 strtok 不是线程安全的,因为它使用一个静态变量来存储上下文信息。在多线程环境中,应该使用 POSIX 提供的 strtok_r 函数,它接受一个额外的参数来保存状态信息,从而避免竞态条件。
  1. 连续调用:在第一次调用后,必须传递 NULL 作为 str 参数以继续分割操作。
  1. 空字符串的处理:如果 str 是一个空字符串,strtok 将立即返回 NULL 而不会修改 str
  1. 分隔符中的特殊字符:如果分隔符字符串中包含空字符,则行为未定义。通常应避免这种情况。

快乐的时光总是短暂,咱们下篇博文再见啦!!!不要忘了,给小编点点赞和收藏支持一下,在此非常感谢!!!


http://www.kler.cn/a/519778.html

相关文章:

  • LongLoRA:高效扩展大语言模型上下文长度的微调方法
  • 验证二叉搜索树(力扣98)
  • 后盾人JS--闭包明明白白
  • SAP新增公司间交易的配置点---SD部分内容
  • 【2024年华为OD机试】(A卷,200分)- 查找树中元素 (JavaScriptJava PythonC/C++)
  • React第二十五章(受控组件/非受控组件)
  • C++11新特性之auto与decltype(总结)
  • Java 基础知识
  • zyNo.17(Web题型总结3)
  • STM32 GPIO配置 点亮LED灯
  • macOS使用LLVM官方发布的tar.xz来安装Clang编译器
  • pycharm 运行远程环境问题 Error:Failed to prepare environment.
  • 【Python・机器学习】多元回归模型(原理及代码)
  • Git上传了秘钥如何彻底修改包括历史记录【从安装到实战详细版】
  • Kafka 如何实现高性能
  • 【AI日记】25.01.25
  • 【C++总览】
  • Fossil源码在Windows下编译
  • Kafka运维宝典 (二)- kafka 查看kafka的运行状态、broker.id不一致导致启动失败问题、topic消息积压量告警监控脚本
  • 【DIY小记】减肥10kg保持半年的经验分享
  • 蓝桥杯试题:整数反转
  • Spring Data JPA 实战:构建高性能数据访问层
  • 基于SpringBoot的软件产品展示销售系统
  • w173疫苗发布和接种预约系统
  • 利用metaGPT多智能体框架实现智能体-1
  • Midjourney中的强变化、弱变化、局部重绘的本质区别以及其有多逆天的功能