【C语言】字符串操作总结

目录

前言

1.字符串逆序输出

(1)不改变输入的字符串

(2)改变输入的字符串

2.求字符串长度的函数strlen

3.字符串拷贝函数strcpy

4.字符串连接函数strcat

5.字符串比较函数strcmp

6.strncpy(p, p1, n) 复制指定长度字符串  

7.strncat(p, p1, n) 附加指定长度字符串

8.strcasecmp忽略大小写比较字符串

9.strncmp(p, p1, n) 比较指定长度字符串

10.strchr(p, c) 在字符串中查找指定字符

11.strstr(p, p1) 查找字符串 

12.isalpha() 检查是否为字母字符

13.isupper() 检查是否为大写字母字符

14.islower() 检查是否为小写字母字符

15.isdigit() 检查是否为数字


前言

总结了常用字符串函数操作和C语言字符串函数的实现


1.字符串逆序输出

(1)不改变输入的字符串

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

#define N 20

int main(int argc, char *argv[])
{
        char arr[N]; // 使用N初始化数组大小
        int i, n;

        printf("Please input a string:");
        fgets(arr, sizeof(arr), stdin); // 更安全的方式获取输入,使用fgets()函数

        n = strlen(arr); 
        for (i = n-1; i >= 0; i--)
                putchar(arr[i]);
        putchar('\n');

        return 0;
}

 

(2)改变输入的字符串

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

#define N 20

int main(int argc, char *argv[])
{
        char arr[N] = {0};
        int i, j, n, ch;

        printf("Please input a string:");
        fgets(arr, sizeof(arr), stdin); // 使用fgets安全地获取输入,指定最大读取字符数为数组大小

        n = strlen(arr);
        i = 0;
        j = n-1;
        while (i < j) 
        {
                ch = arr[i];
                arr[i] = arr[j];
                arr[j] = ch;
                i++;
                j--;
        }

        fputs(arr, stdout); // 使用fputs输出字符串,不会自动添加换行符

        return 0;
}

2.求字符串长度的函数strlen

size_t strlen(const char *str);
参数 str 是要计算长度的字符串,返回值是该字符串的长度。

格式:strlen(字符数组)

功能:计算字符串长度

返值:返回字符串实际长度,不包括‘\0’在内

\xhh表示十六进制数代表的符号

\ddd表示8进制的

例:对于以下字符串,strlen(s)的值为:

char  s[10]={‘A’,‘\0’,‘B’,‘C’,‘\0’,‘D’};

char  s[ ]=“\t\v\\\0will\n”;

char  s[ ]=“\x69\141\n”; 答案:1   3   3

函数实现思路:

#include <stddef.h> // 为了使用 size_t 类型

size_t strlen(const char *str) 
{
    size_t length = 0; // 初始化字符串长度为 0

    // 循环直到遇到字符串的结尾
    while (*str != '\0') 
    {
        length++; // 每遍历一个字符,长度加一
        str++;    // 指针向后移动到下一个字符
    }

    return length; // 返回字符串长度
}

 

3.字符串拷贝函数strcpy

char *strcpy(char *dest, const char *src);

 参数 dest 是目标字符串,src 是源字符串。该函数将 src 中的内容复制到 dest 中,并返回 dest

格式:strcpy(字符数组1,字符串2)

功能:将字符串2,拷贝到字符数组1中去

返值:返回字符数组1的首地址

说明: 字符数组1必须足够大 ,拷贝时‘\0’一同拷贝 

函数实现思路

char *strcpy(char *dest, const char *src) 
{
    char *p = dest; // 保存目标字符串的起始地址

    // 将源字符串的每个字符复制到目标字符串中,直到遇到源字符串的结尾
    while (*src != '\0')
    {
        *dest = *src; // 将源字符串的字符复制到目标字符串中
        dest++;       // 指针移动到下一个目标字符串的位置
        src++;        // 源字符串的指针也移动到下一个字符
    }

    *dest = '\0'; // 在目标字符串的末尾添加 null 字符 '\0'

    return p; // 返回目标字符串的起始地址
}

 

4.字符串连接函数strcat

char *strcat(char *dest, const char *src);

 参数 dest 是目标字符串,src 是要连接的字符串。该函数将 src 中的内容连接到 dest 的末尾,并返回 dest

格式:strcat(字符数组1,字符数组2)

功能:把字符数组2连到字符数组1后面

返值:返回字符数组1的首地址

说明: 字符数组1必须足够大 以容纳原始字符串的内容和新的字符串内容

连接前,两串均以‘\0’结束;

连接后,串1的‘\0’取消,新串最后加‘\0’

函数实现思路:

char *strcat(char *dest, const char *src) 
{
    char *p = dest; // 保存目标字符串的起始地址

    // 移动指针到目标字符串的结尾
    while (*dest != '\0') 
    {
        dest++;
    }

    // 将源字符串的内容复制到目标字符串的末尾
    while (*src != '\0') 
    {
        *dest = *src; // 将源字符串的字符复制到目标字符串的末尾
        dest++;       // 指针移动到下一个目标字符串的位置
        src++;        // 源字符串的指针也移动到下一个字符
    }

    *dest = '\0'; // 在目标字符串的末尾添加 null 字符 '\0'

    return p; // 返回目标字符串的起始地址
}

 

5.字符串比较函数strcmp

int strcmp(const char *str1, const char *str2);

参数 str1str2 是要比较的两个字符串。如果两个字符串相等,返回值为 0;如果 str1 按字典顺序小于 str2,则返回值小于 0;如果 str1 按字典顺序大于 str2,则返回值大于 0。

格       式:strcmp(字符串1,字符串2)

功       能:比较两个字符串   比较规则:对两串从左向右逐个字符比较                      

                (ASCII码),直到遇到不同字符或‘\0’为止                                          

返       值:返回int型整数

        a. 若字符串1< 字符串2, 返回负整数

        b. 若字符串1> 字符串2, 返回正整数

        c. 若字符串1== 字符串2, 返回零 

函数实现: 

int strcmp(const char *str1, const char *str2) 
{
    while (*str1 != '\0' && *str2 != '\0' && *str1 == *str2) 
    {
        str1++;
        str2++;
    }
    return (*str1 - *str2); // 返回字符串比较结果
}

 

6.strncpy(p, p1, n) 复制指定长度字符串  

strncpy 函数用于将源字符串的指定长度复制到目标字符串中。如果源字符串的长度小于指定长度,则在复制完源字符串后,目标字符串的剩余空间将用空字符填充。 

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

参数 dest 是目标字符串,src 是源字符串,n 是要复制的字符数。

 函数实现:

#include <stddef.h> // 为了使用 size_t 类型

// 将源字符串的内容复制到目标字符串,最多复制 n 个字符
char *strncpy(char *dest, const char *src, size_t n) 
{
    char *p = dest; // 保存目标字符串的起始地址

    // 拷贝源字符串的内容到目标字符串,直到达到指定的字符数或者遇到源字符串的结尾
    while (n > 0 && *src != '\0') 
    {
        *dest++ = *src++; // 将源字符串的字符复制到目标字符串中
        n--;
    }

    //如果源字符串的长度小于指定长度,则在复制完源字符串后,目标字符串的剩余空间将用空字符填充。 
    while (n > 0) 
    {
        *dest++ = '\0'; 
    }

    return p; // 返回目标字符串的起始地址
}

7.strncat(p, p1, n) 附加指定长度字符串

strncat 函数用于将源字符串的指定长度附加到目标字符串的末尾。

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

参数 dest 是目标字符串,src 是源字符串,n 是要附加的字符数。

函数实现:

char *strncat(char *dest, const char *src, size_t n) 
{
    char *p = dest; // 保存目标字符串的起始地址

    // 移动指针到目标字符串的结尾
    while (*dest != '\0') 
    {
        dest++;
    }

    // 将源字符串的内容复制到目标字符串的末尾,最多复制 n 个字符
    while (n > 0 && *src != '\0') 
    {
        *dest++ = *src++; // 将源字符串的字符复制到目标字符串的末尾
        n--;
    }

    *dest = '\0'; // 在目标字符串的末尾添加 null 字符 '\0'

    return p; // 返回目标字符串的起始地址
}

 

8.strcasecmp忽略大小写比较字符串

strcasecmp 函数用于比较两个字符串,忽略大小写。其原型为:

int strcasecmp(const char *str1, const char *str2);

参数 str1str2 是要比较的两个字符串。如果两个字符串相等(不区分大小写),返回值为 0;否则返回非 0 值。

函数实现:

#include <ctype.h> // 为了使用 tolower 函数

int strcasecmp(const char *str1, const char *str2) 
{
    while (*str1 != '\0' && *str2 != '\0' && tolower(*str1) == tolower(*str2)) 
    {
        str1++;
        str2++;
    }
    return (tolower(*str1) - tolower(*str2)); // 返回字符串比较结果
}

 

9.strncmp(p, p1, n) 比较指定长度字符串

strncmp 函数用于比较两个字符串的前n个字符。其原型为:

int strncmp(const char *str1, const char *str2, size_t n);

参数 str1str2 是要比较的两个字符串,n 是要比较的字符数。如果两个字符串的前n个字符相等,返回值为 0;否则返回非 0 值。

函数实现:

#include <stddef.h> // 为了使用 size_t 类型

int strncmp(const char *str1, const char *str2, size_t n) 
{
    while (n > 0 && *str1 != '\0' && *str2 != '\0' && *str1 == *str2) 
    {
        str1++;
        str2++;
        n--;
    }
    if (n == 0) 
    {
        return 0; // 前 n 个字符相等
    } 
    else 
    {
        return (*str1 - *str2); // 返回字符串比较结果
    }
}

 

10.strchr(p, c) 在字符串中查找指定字符

strchr 函数在字符串中查找指定字符,并返回第一个匹配到的字符的指针。其原型为:

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

参数 str 是要搜索的字符串,c 是要查找的字符。如果找到了指定字符,则返回该字符在字符串中的地址;否则返回 NULL。

 函数实现:

char *strchr(const char *str, int c) 
{
    while (*str != '\0') 
    {
        if (*str == c) 
        {
            return (char *)str; // 返回指定字符在字符串中的位置
        }
        str++;
    }
    return NULL; // 没有找到指定字符,返回 NULL
}

11.strstr(p, p1) 查找字符串 

strstr 函数在字符串中查找指定子字符串,并返回第一个匹配到的子字符串的指针。其原型为:

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

参数 haystack 是要搜索的字符串,needle 是要查找的子字符串。如果找到了指定的子字符串,则返回该子字符串在字符串中的地址;否则返回 NULL。

函数实现:

char *strstr(const char *haystack, const char *needle) 
{
    while (*haystack != '\0') 
    {
        const char *h = haystack;
        const char *n = needle;

        // 在 haystack 中查找与 needle 第一个字符匹配的位置
        while (*h != '\0' && *n != '\0' && *h == *n) 
        {
            h++;
            n++;
        }

        // 如果找到了 needle,则返回其在 haystack 中的位置
        if (*n == '\0') 
        {
            return (char *)haystack;
        }

        // 否则,继续搜索下一个字符
        haystack++;
    }

    // 如果 haystack 中不存在 needle,则返回 NULL
    return NULL;
}

 

12.isalpha() 检查是否为字母字符

isalpha 函数用于检查一个字符是否为字母字符(即 A-Z 或 a-z)。其原型为:

int isalpha(int c);

如果 c 是一个字母字符,则返回非零值(即真);否则返回 0。

函数实现:

int isalpha(int c) 
{
    return ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'));
}

 

13.isupper() 检查是否为大写字母字符

isupper 函数用于检查一个字符是否为大写字母字符(即 A-Z)。其原型为:

int isupper(int c);

如果 c 是一个大写字母字符,则返回非零值(即真);否则返回 0。

函数实现:

int isupper(int c) 
{
    return (c >= 'A' && c <= 'Z');
}

 

14.islower() 检查是否为小写字母字符

islower 函数用于检查一个字符是否为小写字母字符(即 a-z)。其原型为:

int islower(int c);

如果 c 是一个小写字母字符,则返回非零值(即真);否则返回 0。

函数实现:

int islower(int c) 
{
    return (c >= 'a' && c <= 'z');
}

 

15.isdigit() 检查是否为数字

isdigit 函数用于检查一个字符是否为数字字符(即 0-9)。其原型为:

int isdigit(int c);

如果 c 是一个数字字符,则返回非零值(即真);否则返回 0。

函数实现:

int isdigit(int c) 
{
    return (c >= '0' && c <= '9');
}

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

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

相关文章

掌握JavaScript面向对象编程核心密码:深入解析JavaScript面向对象机制对象概念、原型模式与继承策略全面指南,高效创建高质量、可维护代码

ECMAScript&#xff08;简称ES&#xff0c;是JavaScript的标准规范&#xff09;支持面向对象编程&#xff0c;通过构造函数模拟类&#xff0c;原型链实现继承&#xff0c;以及ES6引入的class语法糖简化面向对象开发。对象可通过构造函数创建&#xff0c;使用原型链共享方法和属…

【云原生】Docker 的网络通信

Docker 的网络通信 1.Docker 容器网络通信的基本原理1.1 查看 Docker 容器网络1.2 宿主机与 Docker 容器建立网络通信的过程 2.使用命令查看 Docker 的网络配置信息3.Docker 的 4 种网络通信模式3.1 bridge 模式3.2 host 模式3.3 container 模式3.4 none 模式 4.容器间的通信4.…

小白如何搭建git

1、安装git 在Windows上安装git&#xff1a; 关注微信公众号“机器人学”回复 “搭建git” 利用百度云网盘下载安装包&#xff0c;建议下载如下版本的否则可能会出现错误。 安装完成后&#xff0c;在开始菜单里Git->git bash&#xff0c;弹出命令窗说明git安装成功。 鼠标右…

【Python项目】基于DJANGO的【基于语音识别的智能垃圾分类系统】

技术简介&#xff1a;使用Python技术、DJANGO框架、MYSQL数据库等实现。 系统简介&#xff1a;用户们可以在系统上面录入自己的个人信息&#xff0c;录入后还可以对信息进行修改&#xff0c;网站可以对用户上传的音频文件进行识别&#xff0c;然后进行垃圾分类。 背景&#xf…

【学习AI-相关路程-工具使用-自我学习-NVIDIA-cuda-工具安装 (1)】

【学习AI-相关路程-工具使用-自我学习-NVIDIA-cuda &#xff08;1&#xff09;】 1、前言2、环境配置1、对于jetson orin nx 的cuda环境2、对于Ubuntu 20.04下cuda环境 3、自我总结-安装流程1、在ubuntu下&#xff0c;如果想使用cuda平台&#xff0c;应该注意什么 和 都安装什么…

BGE向量模型架构和训练细节

模型论文&#xff1a;https://arxiv.org/pdf/2309.07597 模型数据&#xff1a;https://data.baai.ac.cn/details/BAAI-MTP 训练数据 由无标签数据和有标签数据组成。 无标签数据使用了悟道等数据集&#xff0c;有标签数据使用了dureader等数据集。 都是文本对&#xff0c;对于…

rust使用Atomic创建全局变量和使用

Mutex用起来简单&#xff0c;但是无法并发读&#xff0c;RwLock可以并发读&#xff0c;但是使用场景较为受限且性能不够&#xff0c;那么有没有一种全能性选手呢&#xff1f; 欢迎我们的Atomic闪亮登场。 从 Rust1.34 版本后&#xff0c;就正式支持原子类型。原子指的是一系列…

【redis】Redis数据类型(五)ZSet类型

目录 类型介绍特点补充 使用场景 Zset类型数据结构ziplist&#xff1a;压缩列表&#xff08;参考之前的文章&#xff09;skiplist&#xff1a;跳表解析 面试题&#xff1a;MySQL索引为什么用B树而不用跳表区别总结 常用命令ZADD示例 ZREM示例 ZCARD示例 ZCOUNT示例 ZSCORE示例 …

在线OJ——链表经典例题详解

引言&#xff1a;本篇博客详细讲解了关于链表的三个经典例题&#xff0c;分别是&#xff1a;环形链表&#xff08;简单&#xff09;&#xff0c;环形链表Ⅱ&#xff08;中等&#xff09;&#xff0c;随机链表的复制&#xff08;中等&#xff09;。当你能毫无压力地听懂和成功地…

单调栈|496.下一个更大元素I

力扣题目链接 class Solution { public:vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {stack<int> st;vector<int> result(nums1.size(), -1);if (nums1.size() 0) return result;unordered_map<int, …

去哪儿网机票服务请求体bella值逆向

作者声明&#xff1a;文章仅供学习交流与参考&#xff01;严禁用于任何商业与非法用途&#xff01;否则由此产生的一切后果均与作者无关&#xff01;如有侵权&#xff0c;请联系作者本人进行删除&#xff01; 一、加密定位 直接全局搜索bella&#xff0c;在可疑的地方下断&…

pandas学习笔记12

缺失数据处理 其实在很多时候&#xff0c;人们往往不愿意过多透露自己的信息。假如您正在对用户的产品体验做调查&#xff0c;在这个过程中您会发现&#xff0c;一些用户很乐意分享自己使用产品的体验&#xff0c;但他是不愿意透露自己的姓名和联系方式&#xff1b; 还有一些用…

使用C#和NMODBUS快速搭建MODBUS从站模拟器

MODBUS是使用广泛的协议&#xff0c;通讯测试时进行有使用。Modbus通讯分为主站和从站&#xff0c;使用RS485通讯时同一个网络内只能有一个主站&#xff0c;多个从站。使用TCP通讯时没有这方面的限制&#xff0c;可以同时支持多个主站的通讯读写。 开发测试时有各种复杂的需求&…

05 - 步骤 JSON output

简介 JSON Output 步骤用于将 Kettle 中的行流数据写出到 JSON 格式的文件或流中。它允许用户将 Kettle 中处理过的数据以 JSON 格式进行输出&#xff0c;适用于各种数据处理和交换场景。 什么是行流数据&#xff1f; preview data 中的每一个字段都是一个行流数据 使用 场…

54.HarmonyOS鸿蒙系统 App(ArkTS)tcp socket套接字网络连接收发测试

工程代码https://download.csdn.net/download/txwtech/89258409?spm1001.2014.3001.5501 54.HarmonyOS鸿蒙系统 App(ArkTS)tcp socket套接字网络连接收发测试 import socket from ohos.net.socket; import process from ohos.process; import wifiManager from ohos.wifiMana…

ton-http-api安装部署

1、拉取github代码 mkdir /data git clone https://github.com/toncenter/ton-http-api.git cd ton-http-api2、创建环境变量 ./configure.py cat .env TON_API_CACHE_ENABLED0 TON_API_CACHE_REDIS_ENDPOINTcache_redis TON_API_CACHE_REDIS_PORT6379 TON_API_CACHE_REDIS_T…

前后端分离实践:使用 React 和 Express 搭建完整登录注册流程

文章目录 概要整体架构流程技术名词解释ReactExpressReact RouterAnt Design 技术细节前端设计后端逻辑数据交互 小结 概要 本项目是一个基于React和Express的简单登录注册系统。通过前后端分离的方式&#xff0c;实现了用户的注册、登录和查看用户列表等功能。前端使用React框…

HCIP第二节

OSPF&#xff1a;开放式最短路径协议&#xff08;属于IGP-内部网关路由协议&#xff09; 优点&#xff1a;相比与静态可以实时收敛 更新方式&#xff1a;触发更新&#xff1a;224.0.0.5/6 周期更新&#xff1a;30min 在华为设备欸中&#xff0c;默认ospf优先级是10&#…

安居水站:《是谁毁掉了下一代?》

在时光的长河中&#xff0c;我们总能听到这样的声音。四十年前&#xff0c;人们惊恐地呼喊&#xff0c;武侠小说会毁掉下一代&#xff1b;三十年前&#xff0c;流行音乐被视为罪魁祸首&#xff1b;二十年前&#xff0c;电视节目背负起这沉重的指责&#xff1b;十年前&#xff0…

WWW‘24 | 课程学习CL+模仿学习IL用于ETF及商品期货交易

WWW24 | 课程学习CL模仿学习IL用于ETF及商品期货交易 原创 QuantML QuantML 2024-05-04 13:47 论文地址&#xff1a;[2311.13326] Curriculum Learning and Imitation Learning for Model-free Control on Financial Time-series (arxiv.org) 本文探讨了在金融时间序列数据上…
最新文章