字符串库函数详解"/>
字符串库函数详解
字符串库函数详解(上)
一.strlen函数
strlen函数求字符串长度在这里插入代码片
#include<stdio.h>
#include<string.h>
int main(){
char str[1024]={0};
printf("请输入字符串:");
gets(str);
printf("%d\n",strlen(str));
return 0;
我们也可以自己实现strlen库函数
#include<stdio.h>
#include<assert.h>
size_t myStrlen(const char* str){
assert(str!=NULL);
size_t count=0;
while(*str!='\0'){
count++;
}
return count;
}
int main(){
char str[]="abcdef";
printf("%d\n",myStrlen(str));
return 0;
}
二.strcpy函数实现复制字符串
#include<stdio.h>
#include<string.h>
int main(){
char str1[1024];
char str2[]="abcdef";
printf("%s\n",strcpy(str1,str2));
return 0;
}
通过这段代码我们可以实现将字符串str2复制到str1上
那么如何自己通过代码来实现strcpy呢?
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
char* myStrcpy(char* dest,const char* src){
*char* ret=dest;
assert(dest!=NULL);
assert(src!=NULL);
while(*src){
*dest=*src;
src++;
dest++
}
return ret;
}
int main(){
char str1[1024]={0};
char str2[]="abcdef";
printf("%s\n",myStrcpy(str1,str2));
return 0;
}
此代码中的关键在于我们需要创建一个指针变量指向目的字符串,这样就可以做到中间变量保存字符串的效果。
除此之外我们还可以通过数组下标方式来操作。
#include<stdio.h>
#include<assert.h>
char* myStrcpy(char*dest,const char* src){
assert(dest!=NULL);
assert(src!=NULL);
int i=0;
while(src[i]!='\0'){dest[i]=src[i];i++;
}
dest[i]='\0';
return dest;
}
int main(){
char str1[1024]={0};
char str2[]="abcdef";
printf("%s\n",myStrcpy(str1,str2));
return 0;
}
三.strcat 函数拼接字符串
#include<stdio.h>
#include<string.h>
int main(){
char str[80]={0};
strcat(str,"i ");
strcat(str,"am ");
strcat(str,"giggle.");
printf("%s\n",str);
return 0;
}
最终输出结果为i am giggle.
我们通过strcat实现将一个字符串拼接到另一个字符串后面
注意:我们要保证destination的字符串所占内存空间能保存你需要拼接在后的字符串
接下来我们通过一段代码来模拟实现strcat库函数
#include<stdio.h>
#include<assert.h>
char* myStrcat(char* dest,const char* src){
char* ret=dest;
assert(dest!=NULL);
assert(src!=NULL);
while(*dest){
dest++;
}
while(*dest++==*src){
src++;
}
return ret;
}
//方法二(数组下表处理)
//int desttail=0;
//while(dest[desttail]!='\0'){
//desttail++;
//}
//int i=0;
//while(src[i]!='\0'){
//dest[desttail+i]=src[i];
//i++;
//}
//dest[desttail+i]='\0';
//return dest;
int main(){
char str1[1024]="Happy ";
char str2[]="every day.";
printf("%s\n",myStrcat(str1,str2));
return 0;
}
四.strcmp函数
#include<stdio.h>
#include<string.h>
int main(){
char str1[]="hello";
char str2[]="hallo";
printf("%d\n",strcmp(str1,str2));
//最终输出结果为1
return 0;
}
字符串比较大小按照字典序进行,谁靠前谁就较小。
比较结果返回值为正数,则表示前一个字符串大于后一个字符串
返回值为0则相同字符串,
返回值为负数则相反。
接下来通过代码来模拟实现strcmp库函数
#include<stdio.h>
#include<assert.h>
int myStrcmp(const char* str1,const char* str2){
assert(str1!=NULL);
assert(str2!=NULL);
const char* p1=str1;
const char* p2=str2;
while(*p1&&*p2){
if(*p1>*sp2){
return 1;
}
else if(*p1<*p2){
return -1;
}
else{
p1++;
p2++;
}
}
if(*p1<*p2){
return -1;
}
if(*p1>*p2){
return 1;
}
else{
return 0;
}
}
int main(){
char str1[]="hello";
char str2[]="hallo";
printf("%d\n",myStrcmp(str1,str2));
return 0;
}
注意:在实际的库函数中输出结果只能确定是正负与零
五.strncpy函数
strncpy函数与strcpy函数的区别在于多了一个限制字符复制个数
我们应用此函数实现复制num个字符
#include<stdio.h>
#include<string.h>
int main(){
char str1[1024]="hello";
char str2[1024]="Hello";
char str2[]="world";
//比较strcpy和strncpy的区别
strcpy(str1,str3);
strncpy(str2,str3,sizeof(str3));
return 0;
}
注意:这相对于strcpy函数的弊端在于将字符串复制到目的地址中时可能会出现截断num个,这样可能最终字符串缺少\0
最终可能导致程序崩溃
模拟实现strncpy函数
#include<stdio.h>
#include<assert.h>
char* myStrncpy(char*dest,const char* src,size_t num){
assert(dest!=NULL);
assert(src!=NULL);
assert(num!=0);
size_t i=0;
while(src[i]!='\0'&&i<num){
dest[i]=src[i];
i++;
}
//上面有两种情况会触发循环结束
if(i==num){
return dest;
}
while(i<num){
dest[i]='\0';
i++;
}
return dest;
}
int main(){
char str1[1024]={0};
char str2[]="giggle";
printf("%s\n",myStrncpy(str1,str2,sizeof(str2));
return 0;
}
五.strncat函数
这个和strncpy函数同理,它与strcat函数的区别就是拼接在后的字符数有限制。
#include<stdio.h>
#include<string.h>
int main(){
char str1[1024]="To be ";
char str2[]="or not to be";
//这两个最终输出结果相同
strcat(str1,str2);
strncat(str1,str2,sizeof(str2));
//最终结果为To be or not
strncat(str1,str2,6);
//这时就只能拼接字符串中的前6个
return 0;
}
注意:指向目标数组的指针,该数组应包含一个C字符串,并且足够大以包含串联的结果字符串,包括附加的空字符。
模拟实现strncat函数
#include<stdio.h>
#include<assert.h>
char* myStrncat(char* dest,const char* src,size_t num){
assert(dest!=Null);
assert(src!=NULL);
assert(num!=0);
//利用数组下标更容易操作这种有数字限制的字符串
size_t desttail=0;
while(dest[desttail]){
desttail++;
}
size_t i=0;
while(src[i]!='\0'&&i<num){
dest[desttail+i]=src[i];
i++;
}
dest[desttail+i]='\0';
return dest;
}
int main(){
char str1[1024]="To be ";
char str2[]="or not to be";
printf("%s\n",myStrncat(str1,str2,sizeof(str2));
return 0;
}
六.strncmp函数
比较两个字符串的前n个字符的大小关系
我们只需要简单模拟一下此函数,应用此函数的话与strncmp函数同理
#include<stdio.h>
#include<assert.h>
int myStrcmp(const char* str1,const char* str2,size_t num){
assert(str1!=NULL);
assert(str2!=NULL);
const char* p1=str1;
const char* p2=str2;
size_t i=0;
while(*p1&&*p2&&i<num){
if(*p1>*p2){
return 1;
}
else if(*p1<*p2){
return -1;
}
else{
i++;
}
}
//有三种情况会触发循环结束
if(*p1){
return -1;
}
else if(*p2){
return 1;
}
else{
return 0;
}
}
int main(){
char str1[]="giggle";
char str2[]="gaggle";
printf("%d\n",myStrcmp(str1,str2));
return 0;
}
总结:在模拟库函数实现时,首先重要的一点是校验参数的合法性,这是我们程序员思想的必备
在代码中我使用了assert断言,一旦触发程序就会崩溃,因此我们也可以使用if语句来代替
字符串函数的特点是我们可以通过指针来操作,也可以使用数组下标操作,在后面函数例如strncpy,strncat等函数中我们选择使用数组下标,这样方便我们控制字符个数。
更多推荐
字符串库函数详解
发布评论