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. 分隔符中的特殊字符:如果分隔符字符串中包含空字符,则行为未定义。通常应避免这种情况。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/959764.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

美创科技获浙江省网络空间安全协会年度表彰

近日&#xff0c;浙江省网络空间安全协会第二届理事会第三次会议在杭州隆重召开&#xff0c;会议总结部署工作、表彰先进、分享创新实践成果。 会上&#xff0c;省委网信办副主任马晓军出席会议并致辞、宋皆荣理事长向第二届理事会报告2024年协会工作、常务副理事长单位浙江联通…

基于springboot+vue的古城景区管理系统的设计与实现

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

【R语言】函数

一、函数格式 如下所示&#xff1a; hello&#xff1a;函数名&#xff1b;function&#xff1a;定义的R对象是函数而不是其它变量&#xff1b;()&#xff1a;函数的输入参数&#xff0c;可以为空&#xff0c;也可以包含参数&#xff1b;{}&#xff1a;函数体&#xff0c;如果…

PSD是什么图像格式?如何把PSD转为JPG格式?

在图形设计的世界里&#xff0c;Photoshop 文档&#xff08;PSD&#xff09;格式是 Adobe Photoshop 的原生文件格式&#xff0c;它允许设计师保存图像中的图层、蒙版、透明度和不同色彩模式等信息。对于需要进一步编辑的设计作品来说&#xff0c;PSD 文件提供了极大的灵活性。…

PIC单片机设置bootloader程序和app程序地址方法

在调试bootloader和app程序的时候通常都需要设置程序的偏移地址&#xff0c;下面就总结一下使用MPLAB X IDE 设置程序地址的方法。 打开bootloader工程 工程上单击鼠标右键&#xff0c;选择Properties,打工工程属性窗口。 此时会打开项目属性对话框 左边类别选择XC8 Line…

电脑办公技巧之如何在 Word 文档中添加文字或图片水印

Microsoft Word是全球最广泛使用的文字处理软件之一&#xff0c;它为用户提供了丰富的编辑功能来美化和保护文档。其中&#xff0c;“水印”是一种特别有用的功能&#xff0c;它可以用于标识文档状态&#xff08;如“草稿”或“机密”&#xff09;、公司标志或是版权信息等。本…

程序诗篇里的灵动笔触:指针绘就数据的梦幻蓝图<1>

大家好啊&#xff0c;我是小象٩(๑ω๑)۶ 我的博客&#xff1a;Xiao Xiangζั͡ޓއއ 很高兴见到大家&#xff0c;希望能够和大家一起交流学习&#xff0c;共同进步。 这一节我们来学习指针的相关知识&#xff0c;学习内存和地址&#xff0c;指针变量和地址&#xff0c;包…

WPS计算机二级•幻灯片的页面布局

听说这是目录哦 设置PPT页面尺寸&#x1f5bc;️PPT母版怎么用&#x1f3a8;巧用PPT母版统一修改 字体颜色与背景&#x1f3a1;如何快速更改应用 幻灯片中的不同母版&#x1f451;能量站&#x1f61a; 设置PPT页面尺寸&#x1f5bc;️ 在制作PPT时&#xff0c;我们需要先选定一…

攻防世界bad_python

文件名pyre.cpython-36.pyc&#xff0c;说明是在python3.6环境下编译的&#xff0c;要把pyc反编译成py 但是显示失败了&#xff0c;结合题的名字文件的应该是文件头部被破坏 把第一行改为33 0D 0D 0A 0C 63 4A 63 61 02 00 00 E3 00 00 00 之后就能反编译了&#xff0c;得到源…

Windows系统Tai时长统计工具的使用体验

Windows系统Tai时长统计工具的使用体验 一、Tai介绍1.1 Tai简介1.2 安装环境要求 二、下载及安装Tai2.1 下载Tai2.2 运行Tai工具 三、Tai的使用体验3.1 系统设置3.2 时长统计3.3 分类管理 四、总结 一、Tai介绍 1.1 Tai简介 Tai是一款专为Windows系统设计的开源软件&#xff…

相同的树及延伸题型(C语言详解版)

从LeetCode 100和101看二叉树的比较与对称性判断 今天要讲的是leetcode100.相同的树&#xff0c;并且本文章还会讲到延伸题型leetcode101.对称二叉树。本文章编写用的是C语言&#xff0c;大家主要是学习思路&#xff0c;学习过后可以自己点击链接测试&#xff0c;并且做一些对…

微信小程序-点餐(美食屋)02开发实践

目录 概要 整体架构流程 &#xff08;一&#xff09;用户注册与登录 &#xff08;二&#xff09;菜品浏览与点餐 &#xff08;三&#xff09;订单管理 &#xff08;四&#xff09;后台管理 部分代码展示 1.index.wxml 2.list.wxml 3.checkout.wxml 4.detail.wxml 小结优点 概要…

计算机工程:解锁未来科技之门!

计算机工程与应用是一个充满无限可能性的领域。随着科技的迅猛发展&#xff0c;计算机技术已经深深渗透到我们生活的方方面面&#xff0c;从医疗、金融到教育&#xff0c;无一不在彰显着计算机工程的巨大魅力和潜力。 在医疗行业&#xff0c;计算机技术的应用尤为突出。比如&a…

OS Copilot功能测评:智能助手的炫彩魔法

简介&#xff1a; OS Copilot 是一款融合了人工智能技术的智能助手&#xff0c;专为Linux系统设计&#xff0c;旨在提升系统管理和运维效率。本文详细介绍了在阿里云ECS实例上安装和体验OS Copilot的过程&#xff0c;重点评测了其三个核心参数&#xff1a;-t&#xff08;模式…

随机变量的变量替换——归一化流和直方图规定化的数学基础

变量替换是一种在统计学和数学中广泛应用的技术&#xff0c;它通过定义新的变量来简化问题&#xff0c;使得原本复杂的随机变量变得更加容易分析。 变量替换的公式&#xff0c;用于将一个随机变量 X X X 的概率密度函数 f X f_X fX​ 转换为其经过函数 g g g 变换后的随机变…

新电脑安装系统找不到硬盘原因和解决方法来了

有不少网友反馈新电脑采用官方u盘方式装win10或win100出现找不到硬盘是怎么回事&#xff1f;后来研究半天发现是bios中开启了rst(vmd)模式。如果关闭rst模式肯定是可以安装的&#xff0c;但这会影响硬盘性能&#xff0c;有没有办法解决开启rst模式的情况安装win10或win11呢&…

Maui学习笔记-SignalR简单介绍

SignalR是ASP.NET Core中的一个库,支持服务器与其连接的客服端之间的双象通信,它允许服务器立即将更新的消息推送到客服端,而不是要求客户端轮询服务器来获取更新 创建项目 使用SignalR在服务器实时发送消息给客服端,客服端拿到消息后在UI页面更新 首先创建一个Web API项目 …

接口(完)

大家好&#xff0c;今天我们着重来总结一下接口的知识&#xff0c;并且将接口和抽象类的区别罗列一下&#xff0c;帮助我们更好的认识抽象类和接口。 2.7 抽象类和接口的区别. 抽类和接口都是Java中多态的常见使用方式,都需要重点掌握,同时又要认清两者的区别(重要!!&#xf…

机器学习-线性回归(参数估计之经验风险最小化)

给定一组包含 &#x1d441; 个训练样本的训练集 我们希望能够 学习一个最优的线性回归的模型参数 &#x1d498; 现在我们来介绍线性回归的一种模型参数估计方法&#xff1a;经验风险最小化。 我们前面说过&#xff0c;对于标签 &#x1d466; 和模型输出都为连续的实数值&…

77,【1】.[CISCN2019 华东南赛区]Web4

有句英文&#xff0c;看看什么意思 好像也可以不看 进入靶场 点击蓝色字体 我勒个豆&#xff0c;百度哇 所以重点应该在url上&#xff0c;属于任意文件读取类型 接下来该判断框架了 常见的web框架如下 一&#xff0c;Python 框架 1.Flask URL 示例 1&#xff1a;http://…