前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >[C语言日寄] 字符串操作函数的使用及其拓展

[C语言日寄] 字符串操作函数的使用及其拓展

作者头像
siy2333
发布于 2025-03-07 03:28:02
发布于 2025-03-07 03:28:02
7300
代码可运行
举报
文章被收录于专栏:来自csdn的博客来自csdn的博客
运行总次数:0
代码可运行

前言

在C语言中,字符串是程序设计中不可或缺的一部分。C语言本身并没有提供专门的字符串类型,而是通过字符数组来实现字符串操作。为了方便对字符串进行处理,C语言标准库提供了丰富的字符串操作函数。今天,我们就通过一个简单的程序来深入探讨字符串操作函数的使用,以及它们在C语言中的重要性。

题目引入

下面是一个简单的程序,它的输出结果是:( )

代码语言:javascript
代码运行次数:0
运行
复制
#include <stdio.h>
#include <string.h>

void print_string(const char *str) {
    printf("%s\n", str);
}

int main() {
    char str1[20] = "Hello";
    char str2[20] = "World";
    strcat(str1, str2);
    print_string(str1);
    return 0;
}

A. Hello B. World C. HelloWorld D. Hello World

在接下来的文章中,我们会一起把字符串操作函数的知识与题目结合起来,学习这一知识点。

知识点分析

1. 字符串的基本概念

在C语言中,字符串是以字符数组的形式存储的,以空字符(\0)作为结束标志。例如:

代码语言:javascript
代码运行次数:0
运行
复制
char str[] = "Hello";

这里,str 是一个字符数组,包含 6 个字符:'H''e''l''l''o' 和一个空字符 '\0'。空字符是字符串的终止符,用于标识字符串的结束。

2. 常用字符串操作函数

C语言标准库 <string.h> 提供了丰富的字符串操作函数,以下是一些常用的函数及其功能:

(1)字符串拷贝函数:strcpy()

strcpy() 函数用于将一个字符串拷贝到另一个字符串中。其函数原型为:

代码语言:javascript
代码运行次数:0
运行
复制
char *strcpy(char *dest, const char *src);
  • dest 是目标字符串,src 是源字符串。
  • 该函数会将 src 中的字符串(包括终止符 \0)拷贝到 dest 中。
  • 返回值是目标字符串的首地址。

示例:

代码语言:javascript
代码运行次数:0
运行
复制
char src[] = "Hello";
char dest[20];
strcpy(dest, src);
printf("%s\n", dest); // 输出:Hello
(2)字符串连接函数:strcat()

strcat() 函数用于将一个字符串连接到另一个字符串的末尾。其函数原型为:

代码语言:javascript
代码运行次数:0
运行
复制
char *strcat(char *dest, const char *src);
  • dest 是目标字符串,src 是源字符串。
  • 该函数会将 src 中的字符串(不包括终止符 \0)连接到 dest 的末尾。
  • 返回值是目标字符串的首地址。

示例:

代码语言:javascript
代码运行次数:0
运行
复制
char str1[20] = "Hello";
char str2[] = "World";
strcat(str1, str2);
printf("%s\n", str1); // 输出:HelloWorld
(3)字符串比较函数:strcmp()

strcmp() 函数用于比较两个字符串的大小。其函数原型为:

代码语言:javascript
代码运行次数:0
运行
复制
int strcmp(const char *str1, const char *str2);
  • 如果 str1str2 相等,返回 0。
  • 如果 str1 小于 str2,返回负值。
  • 如果 str1 大于 str2,返回正值。

示例:

代码语言:javascript
代码运行次数:0
运行
复制
char str1[] = "apple";
char str2[] = "banana";
int result = strcmp(str1, str2);
printf("%d\n", result); // 输出:负值
(4)字符串长度函数:strlen()

strlen() 函数用于计算字符串的长度(不包括终止符 \0)。其函数原型为:

代码语言:javascript
代码运行次数:0
运行
复制
size_t strlen(const char *str);

示例:

代码语言:javascript
代码运行次数:0
运行
复制
char str[] = "Hello";
size_t length = strlen(str);
printf("%zu\n", length); // 输出:5
(5)字符串查找函数:strstr()

strstr() 函数用于在一个字符串中查找另一个字符串的首次出现位置。其函数原型为:

代码语言:javascript
代码运行次数:0
运行
复制
char *strstr(const char *haystack, const char *needle);
  • haystack 是被搜索的字符串,needle 是要查找的子字符串。
  • 如果找到子字符串,返回子字符串的首地址;否则返回 NULL

示例:

代码语言:javascript
代码运行次数:0
运行
复制
char str[] = "Hello World";
char *result = strstr(str, "World");
if (result) {
    printf("Found: %s\n", result); // 输出:Found: World
} else {
    printf("Not found\n");
}

3. 字符串操作函数的底层实现

为了更好地理解字符串操作函数的工作原理,我们可以简单分析一下它们的底层实现。

(1)strcpy() 的实现
代码语言:javascript
代码运行次数:0
运行
复制
char *strcpy(char *dest, const char *src) {
    char *tmp = dest;
    while ((*tmp++ = *src++) != '\0');
    return dest;
}
  • 通过一个循环,逐个拷贝源字符串中的字符到目标字符串中,直到遇到终止符 \0
  • 返回目标字符串的首地址。
(2)strlen() 的实现
代码语言:javascript
代码运行次数:0
运行
复制
size_t strlen(const char *str) {
    const char *tmp = str;
    while (*tmp++);
    return tmp - str;
}
  • 通过一个循环,逐个遍历字符串中的字符,直到遇到终止符 \0
  • 返回字符串的长度。

注意事项

1. 字符串数组的空间大小

在使用字符串操作函数时,必须确保目标字符串数组有足够的空间来存储结果。例如,在使用 strcpy()strcat() 时,目标字符串数组的大小必须大于或等于源字符串的长度加上终止符 \0 的大小。

错误示例:

代码语言:javascript
代码运行次数:0
运行
复制
char src[] = "Hello World";
char dest[5];
strcpy(dest, src); // 错误:dest 空间不足

正确示例:

代码语言:javascript
代码运行次数:0
运行
复制
char src[] = "Hello World";
char dest[20];
strcpy(dest, src); // 正确:dest 空间足够

2. 字符串的终止符 \0

在处理字符串时,必须确保字符串以终止符 \0 结尾。否则,可能会导致未定义行为,例如在使用 strlen()printf() 时,程序可能会读取超出字符串范围的内存。

错误示例:

代码语言:javascript
代码运行次数:0
运行
复制
char str[5] = {'H', 'e', 'l', 'l', 'o'};
printf("%s\n", str); // 错误:str 没有终止符

正确示例:

代码语言:javascript
代码运行次数:0
运行
复制
char str[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
printf("%s\n", str); // 正确:str 有终止符

3. 避免使用 gets() 函数

gets() 函数用于从标准输入读取一行字符串,但它不会检查目标缓冲区的大小,容易导致缓冲区溢出。因此,gets() 函数已经被废弃,建议使用更安全的替代函数,如 fgets()

错误示例:

代码语言:javascript
代码运行次数:0
运行
复制
char str[20];
gets(str); // 错误:容易导致缓冲区溢出

正确示例:

代码语言:javascript
代码运行次数:0
运行
复制
char str[20];
fgets(str, sizeof(str), stdin); // 正确:更安全的替代

4. 字符串函数的返回值

在使用字符串函数时,需要注意它们的返回值。例如,strcpy()strcat() 返回目标字符串的首地址,而 strcmp() 返回一个整数值。正确使用返回值可以避免潜在的错误。

示例:

代码语言:javascript
代码运行次数:0
运行
复制
char str1[20] = "Hello";
char str2[] = "World";
char *result = strcat(str1, str2);
printf("%s\n", result); // 输出:HelloWorld

拓展应用

1. 字符串反转

字符串反转是一个常见的应用场景,可以通过字符串操作函数实现。以下是一个简单的字符串反转函数:

代码语言:javascript
代码运行次数:0
运行
复制
#include <stdio.h>
#include <string.h>

void reverse_string(char *str) {
    int length = strlen(str);
    for (int i = 0; i < length / 2; i++) {
        char temp = str[i];
        str[i] = str[length - i - 1];
        str[length - i - 1] = temp;
    }
}

int main() {
    char str[] = "Hello";
    reverse_string(str);
    printf("%s\n", str); // 输出:olleH
    return 0;
}

2. 字符串加密

字符串加密可以通过简单的字符替换实现。以下是一个简单的加密函数,将每个字符向后移动一个位置(字母表循环):

代码语言:javascript
代码运行次数:0
运行
复制
#include <stdio.h>
#include <string.h>

void encrypt_string(char *str) {
    int length = strlen(str);
    for (int i = 0; i < length; i++) {
        if (str[i] >= 'a' && str[i] <= 'z') {
            str[i] = (str[i] - 'a' + 1) % 26 + 'a';
        } else if (str[i] >= 'A' && str[i] <= 'Z') {
            str[i] = (str[i] - 'A' + 1) % 26 + 'A';
        }
    }
}

int main() {
    char str[] = "Hello";
    encrypt_string(str);
    printf("%s\n", str); // 输出:Ifmmp
    return 0;
}

3. 字符串分割

字符串分割可以通过 strtok() 函数实现。以下是一个简单的字符串分割示例,将字符串按空格分割:

代码语言:javascript
代码运行次数:0
运行
复制
#include <stdio.h>
#include <string.h>

int main() {
    char str[] = "Hello World This is C";
    char *token = strtok(str, " ");
    while (token) {
        printf("%s\n", token);
        token = strtok(NULL, " ");
    }
    return 0;
}

4. 字符串去重

字符串去重可以通过遍历字符串并删除重复字符实现。以下是一个简单的字符串去重函数:

代码语言:javascript
代码运行次数:0
运行
复制
#include <stdio.h>
#include <string.h>

void remove_duplicates(char *str) {
    int length = strlen(str);
    for (int i = 0; i < length; i++) {
        for (int j = i + 1; j < length; j++) {
            if (str[i] == str[j]) {
                for (int k = j; k < length - 1; k++) {
                    str[k] = str[k + 1];
                }
                length--;
                j--;
            }
        }
    }
}

int main() {
    char str[] = "aabbccddeeff";
    remove_duplicates(str);
    printf("%s\n", str); // 输出:abcdef
    return 0;
}

总结

字符串操作函数是C语言中非常重要的工具,它们可以帮助我们高效地处理字符串。 关注窝,每三天至少更新一篇优质c语言题目详解~

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-03-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
一个天天逃课大三同学的2024年终总结
与社区中的绝大多数人不同,我作为一个还没有历经职场的学生党,对于工作的了解是那么浅显,而在校园这个氛围下,个人认为这个时代的学生陷入了一个怪圈,所谓学历优势被弘扬的多么高尚化,唯分数论依旧是评判一个人的主要标准,步入大学后,身边的同学大多都选择了读研,如果保不了研那就去考,但是从学长学姐那里知道了读研的枯燥牛马生活后,我总是会问自己这样几个问题:
潋湄
2024/12/23
770
一个天天逃课大三同学的2024年终总结
阿韦的2018年总结:我终于要出书了
大家好,我是阿韦,去年开始入驻简书平台,在这里学到了不少干货。首先感谢简书平台,在这里发布博客能够吸引众多志同道合的程序猿小伙伴们,互相交流技术还是挺不错的。
AWeiLoveAndroid
2019/01/28
4540
阿韦的2018年总结:我终于要出书了
【愚公系列】回顾2022年技术博客的总结与展望
大家好我是愚公搬代码,我是2012年05月18日加入CSDN,当时是大二,一不小心,来到CSDN已经3868天。10几年的技术生涯,身为一个全栈程序员所要学习的东西是非常多的,这边给一个总结,主要包含以下几个方面:
愚公搬代码
2022/12/31
3930
1024年度总结 | AI伴我前行,三十依旧青春
白驹过隙,而立之年,毕业时扬言立于技术之巅的梦想觉得越来越远。以前的学习是针对于某一方向/语言不同知识点的学习,能想象到的就是,成为一个集前后端开发于一体的开发者。
叫我阿柒啊
2024/11/10
1590
1024年度总结 | AI伴我前行,三十依旧青春
架构师考试回顾
    今天成绩下来了,本来以为要等到1月17号才会发布,一直没查,还是朋友帮我查了,我才知道已经考试通过了。之前简单地在《2010目标》中描述了一下去年考试的过程,现在既然过了,正好又到了一月反思的时候了,就决定再写这篇博客详细记录一下去年考架构师的整个经历。 为什么要考架构师?     09年12月定的计划,当时定这个目标的原因有以下四个: 办北京户口。 我09年9月份到现在的公司上班。刚到公司的时候,虽然我是是属于社招进来的,但是自己毕竟是当年毕业的应届生,所以就主动问人事部,是否可以为我办北京的户
用户1172223
2018/01/29
1.1K0
架构师考试回顾
2024年终总结
2024年所在的公司被全资收购了,本以为是扭转局势的一年,但是似乎没有那么顺利,产品总监被挖走,高级开发离开,裁了一部分人。12月份通知,合作开发的项目被砍,意味着一年的努力白费了,旧项目被国外公司封锁的原因,没办法继续深入开发了,这意味2025年可能无事可做。
kdyonly
2025/01/02
1110
Python语言的2017年终总结
在1989年12月,我在寻找一门课余编程项目来打发圣诞节假期。办公室会关门,但我有一台家用电脑,而且没有太多其它东西。我决定为当时我正构思的一个新的脚本语言写一个解释器,它是ABC语言的后代,对UNIX / C程序员会有吸引力。作为一个《蒙提·派森的飞行马戏团》(Monty Python's Flying Circus)的狂热爱好者,于是我选择了 "Python"这个名字作为项目的标题。 Python 创始人吉多·范罗苏姆(Guido van Rossum)因为圣诞节假期太无聊,为了打发这几天的时间,不经意
企鹅号小编
2018/01/26
8190
2021年,愿遇见更好的自己,加油!
一转眼,2020年就这么要结束了,转眼就要来到了2021年,到2021年1月,回来参与创业已经有2年余5个月,照例总结一下我的2020年吧,2020年因为疫情的原因,很多计划中的事情或多或少的耽搁了,但是总体来说还是按计划做了不少事。站在2020年的尾巴上,翘首期待着2021年。
Winter_world
2020/12/31
2810
2024回顾与2025展望:AI技术的惊喜与挑战
2024年,AI技术的迅猛发展让我既惊喜又困惑。惊喜的是,AI打开了新世界的大门,各种工具层出不穷,源源不断的新AI技术出现。困惑的是,面对这些新的AI技术,感觉越来越力所不能及,再怎么提升个人能力,也赶不上新的技术发展。作为技术小白,这一年我在体验和尝试各种AI工具和技术,从生活帮助到工作帮助,都能找到合适的工具去配合。
快乐的小白
2025/01/08
1990
2024回顾与2025展望:AI技术的惊喜与挑战
那些逝去的2024与这些希冀的2025——一个ITer的碎碎念
随着日历一页页翻过,我们迎来了新的一年。在过去的一年里,经历了许多挑战与成长,也收获了满满的回忆与感悟。站在2025年的门槛上,回望2024年的点点滴滴,不禁感慨万千。同时,也满怀期待地展望新的一年,为自己设定了新的目标与梦想。
穿过生命散发芬芳
2025/01/21
590
我的2024总结 | 降薪优化、焦虑生病、读书写作、逆势成长
2024年,不知不觉已经过去,2025的春节即将来临。回顾过去365天,如果用一个词来总结,我的2024应该是什么?
拉丁解牛说技术
2025/01/13
3120
总结2024年技术学习:我对编程语言的心得
逐步深入,探讨在 Unity 中使用 C# 进行游戏开发时常见的问题、易错点以及如何避免这些问题。文章内容十分详细,代码使用起来非常高效
凯子坚持C
2024/11/20
1230
【年度总结】关于三掌柜2023全年回顾和总结
面临严峻的技术圈“寒潮”,无人能够幸免,虽然我是主动更换工作,但是我也在换工作的时候遇到了互联网寒冬,亲自体验到了这种萧条的影响有多么的大。不过好在我在2022年底就已经入职工作,只是到了2023年才满6个月,这6个月的工作得到了领导和同事的肯定,顺利转正。本以为转正之后,可以过一段轻松的开发日子,结果公司上层出了问题,一把手被“双规”,至此松懈的开发日子到头了,总行特派的审计小组从4月底入驻,截止目前依然没有撤走,各种搞事情,查问题,搞得上上下下疲于应对各种审计操作。不管别的,总之我顺利转正了,饭碗保住了,天塌下来有位置高的顶着,哈哈。
三掌柜
2023/12/24
6484
【年度总结】关于三掌柜2023全年回顾和总结
编程语言大战2024:Python领跑,Java保持稳定,Rust崛起
2024年,Python巩固了其在AI领域的统治地位,Java证明了其在企业领域的持久影响力,而Rust在内存安全编程方面也取得了进展,这标志着全球三大领先编程语言具有变革性的一年。
云云众生s
2024/12/31
1460
Java的第20年:Java和我的故事
 Java技术诞生于1995年的5月23日,这样一个在程序设计领域长时间占据统治地位并且拥有最好的生态系统的语言起初只是太阳微系统公司(Sun Microsystems)一个失败的机顶盒项目的附产品。Java的第一个正式版本发布于1996年1月23日,在这个最原始的Java版本中,类和接口加起来总共只有211个,那时候的Java并不完美也不强大,但是由于它紧紧的抓住了当时最时髦的两样东西——互联网和浏览器,并拥有完美的平台可移植性,再加上计算机领域的全能奇才James Gosling(Java技术的创始人之
我是攻城师
2018/05/11
1.2K0
关注思考的过程,终将更加卓越 | 2020 年总结
[2021 new chapter] 开篇碎语 2020 年末和 2021 年初在掘金社区和 Twitter 看了诸多大佬的 2020 年总结「顺便膜拜 dalao 的同时学习波文法😀,方便写自己的年度总结」。 2020 年 12 月 08 日,我在 QQ 空间发布了篇“预总结”,特地立了个 flag 🚩『2020年最后一周或者 2021 年第一周把年度总结写出来』,防止自己“赖账”😂。毕竟 2019 年都写了份总结了,2020 年的不能少吧!从那时候开始,就在磨磨唧唧的准备材料,写篇文章不容易啊 /(ㄒo
Cloud-Cloudys
2021/01/07
5470
关注思考的过程,终将更加卓越 | 2020 年总结
我的 2024 年终总结,持续尝试
时光飞逝,一晃就到 2024 的年底了,按照我近年来的传统,就复盘一下今年做过的所有关于探索收入多样性的事情。包括这一年工作以外的 “工作进展”,收获的事项,遇到的种种问题,以及来年的计划等,最后希望能对大家有一点点参考意义。
北桥苏
2024/12/10
2641
我的 2024 年终总结,持续尝试
从港口煤炭工人,到国企大数据负责人:曾经的网瘾少年是怎么做到的?
大家好,我是独孤风,一位曾经的港口煤炭工人,目前在某国企任大数据负责人,公众号大数据流动主理人,近日公众号粉丝也刚刚突破了万人算是一个小小的里程碑。
用户6070864
2022/12/28
2980
从港口煤炭工人,到国企大数据负责人:曾经的网瘾少年是怎么做到的?
2020年终总结:回顾、反思、期待
直到开始写年终总结的时候才发现,记日报的习惯,真的太好了,哈哈哈。因为这一年的所有事情都有迹可循,但是,记的太乱,整理起来是真的痛苦
书旅
2021/01/22
5550
接连被开源项目curl、Prisma弃用,Rust语言遭遇水逆,网友:从狂热粉到后悔莫及
作为一门系统编程语言,Rust 专注于安全,尤其是并发安全。它支持函数式和命令式以及泛型等编程范式的多范式语言,在语法上和 C、C++ 类似。
机器之心
2025/02/03
1400
接连被开源项目curl、Prisma弃用,Rust语言遭遇水逆,网友:从狂热粉到后悔莫及
推荐阅读
相关推荐
一个天天逃课大三同学的2024年终总结
更多 >
目录
  • 前言
  • 题目引入
  • 知识点分析
    • 1. 字符串的基本概念
    • 2. 常用字符串操作函数
      • (1)字符串拷贝函数:strcpy()
      • (2)字符串连接函数:strcat()
      • (3)字符串比较函数:strcmp()
      • (4)字符串长度函数:strlen()
      • (5)字符串查找函数:strstr()
    • 3. 字符串操作函数的底层实现
      • (1)strcpy() 的实现
      • (2)strlen() 的实现
  • 注意事项
    • 1. 字符串数组的空间大小
    • 2. 字符串的终止符 \0
    • 3. 避免使用 gets() 函数
    • 4. 字符串函数的返回值
  • 拓展应用
    • 1. 字符串反转
    • 2. 字符串加密
    • 3. 字符串分割
    • 4. 字符串去重
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档