C语言学习笔记(9)
在这一节,我想主要来介绍一下C语言操作字符串的常用函数。
C语言的字符串函数的原型都驻留在<string.h>头文件中,因此我们在处理字符串时,需要引入这个头文件。
但是,我不希望只是单纯地介绍每个函数的用法,如果那样,看API就可以了,我希望在介绍每个函数时都自己来实现一次。
1. strcpy函数
string copy,我们先来看一下该函数的用法。
#include<stdio.h> #include<string.h> int main() { char *str1="abcd"; char str2[5]; strcpy(str2,str1); printf("%s",str2); return 0; }
在上段代码中,我们注意,str2的字符串长度应该是5,也就是strlen(“abcd”)加上’\0’。在上面的代码中,我们将str1的字符串复制到了str2中。
我们也来看下,这两段代码的区别:
#include<stdio.h> #include<string.h> int main() { char str1[5]="abcd"; char str2[5]; char *str3=str1; strcpy(str2,str1); str1[1]='t'; printf("str2:%s\n",str2); printf("str3:%s",str3); return 0; }
我们对比结果可以发现他们的不同,在这里,我们不妨回头想想Java/C#的深复制和浅复制。
当我们修改第一段代码为这样时会发现错误:
#include<stdio.h> #include<string.h> int main() { char str1[5]="abcd"; char str2[3]; strcpy(str2,str1); str1[1]='t'; printf("str2:%s\n",str2); return 0; }
错误的原因就是,str2不足以容纳下str1的字符串,也就是说strcpy我们没有足够的控制权,那么我们就可以来采用strncpy的方法来实现:
#include<stdio.h> #include<string.h> int main() { char str1[5]="abcd"; char str2[3]; strncpy(str2,str1,sizeof(str2)-1); str2[sizeof(str2)-1]='\0'; printf("str2:%s\n",str2); return 0; }
这个方法就不多说了,就是加上了一个长度控制,接下来我们来试着实现一下简单的strcpy函数。
#include<stdio.h> #include<string.h> char *mycopy(char *,const char *); int main() { char str1[5]="abcd"; char str2[5]; mycopy(str2,str1); printf("%s",str2); return 0; } char *mycopy(char *strDest,const char *strSource) { char *temp=strDest; while(*temp++=*strSource++) ; return strDest; }
同理,我们也可以写出strncpy的代码:
char *mycopy(char *strDest,const char *strSource,int size) { char *temp=strDest; int i =0; while(i<size) { *temp++=*strSource++; i++; } *temp='\0'; return strDest; }
2. 再谈字符串的问题
其实我之前一直都没有想懂关于字符串中修改某一字符的问题,我一直很困扰这样一个问题:
我收回在上一节中说的观点,其实字符串是否能修改取决的是这段字符串是否位于常量区。
3. strlen函数
这个很简单,实现一下:
size_t mylength(char * str) { int count=0; while(*str++) { count++; } return (size_t)count; }
但是如果这样来写,每次当指针前移的时候,都需要进行一次加法操作,会对效率造成一定的影响,我们可以这样来写:
size_t mylength(char * str) { char *temp=str; while(*temp++) ; return (size_t)(temp-str-1); }
4. strcmp函数
字符串比较函数:
int mycompare(const char *str1,const char *str2) { while(*str1==*str2) { if(*str1=='\0') { return 0; } str1++; str2++; } return *str1>*str2?1:-1; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· [AI/GPT/综述] AI Agent的设计模式综述
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
2009-04-11 一步一步学WF系列(二)——工作流与Visual Studio
2009-04-11 重温设计模式(四)——工厂模式