本篇文章均是一些比较基础的C语言字符串操作,欢迎大家阅读!!
一、重写求字符串长度函数(代码如下)
//求字符串长度
int my_strlen(const char *str){ //加const变为只读型
assert(str!=NULL); //断言指针不为空,头文件:#include<assert.h>
int sum=0;
while(*str!='\0'){
sum++;
str++;
}
return sum;
}
关于断言:assert(str!=NULL); //若str不为空,程序正常向下执行;若str指针为空,调用 abort(); 终止程序。
二、常见字符串赋值错误(请大家看下列程序)
#include<stdio.h>
main(){
char stra[10]={"xiaoxin"};
char strb[]={"xiaobai"};
const char *sp="hello";
strb="hello"; //出错!!
return 0;
}
出错原因:strb指的是字符数组首元素地址,地址是常量!!常量不能被赋值!!
关于数组名单独出现情况:除了sizeof(str); //括号内的str指整个数组,其余任何地方出现的数组名均代表数组首元素地址!!!
三、重写字符串拷贝函数(代码如下)
1.较为清晰的写法:
#include<stdio.h>
#include<assert.h>
void my_strcpy(char *dest,const char *src){
assert(src!=NULL&&dest!=NULL);//对函数形参进行健壮性检查(断言不为空!)
while(*src!='\0'){
*dest=*src;
src++;
dest++;
}
*dest='\0'; //别忘了给dest字符数组赋结束标志'\0'!
}
int main(){
char stra[30]={"hello"};
char strb[30];
my_strcpy(strb,stra);
printf("%s",strb);
}
2.改写不同版本的my_strcpy()函数(将所有不同种的都写在下面的代码段)
//第二种
void my_strcpy(char *dest,const char *src){
assert(dest!=NULL&&src!=NULL);
while(*dest=*src){
//赋值语句有返回值,返回的是被赋值后的结果。当赋完'\0'时返回'\0'的ASCII码值0(假),不再进入循环,已全部赋值。
dest++;
src++;
}
}
//第三种
void my_strcpy(char *dest,const char *src){
assert(dest!=NULL&&src!=NULL);
while(*dest++ = *src++);
//将赋值、自增语句全写在一条语句中。(*dest)++ = (*src)++;
//此句话实现了:1.*dest=*src;(由于先赋值,所以可以将'\0'赋值。) 2.dest++; src++;
}
//第四种
void my_strcpy(char *dest,const char *src){
assert(dest!=NULL&&src!=NULL);
int i=0;
while(src[i]!='\0'){ //也可以写成*(src+i)!='\0'
dest[i]=src[i]; //*(dest+i)=*(src+i);
i++;
}
dest[i]='\0';
}
3.下面这种比较严谨,不在原基础上做改动(代码如下)
char* my_strcpy(char *dest,const char *src){
assert(dest!=NULL&&src!=NULL);
char *cp=dest; //通过字符指针cp指向并改变dest指向的内容
while(*src!='\0'){
*cp=*src;
cp++;
src++;
}
*cp='\0';
return dest;
}
四、重写字符串连接函数(代码如下)
char *my_strcat(char *dest,const char *src){
assert(dest!=NULL&&src!=NULL);
char *cp=dest+my_strlen(dest); //要连接这两个字符串,所以cp指向dest数组'\0'位置(用已定义的函数:dest+my_strlen(dest)),再直接一一赋值即可
//同样是通过字符指针cp指向并修改dest指向的内容(不可以直接修改原值!)
while(*src!='\0'){
*cp=*src;
cp++;
src++;
}
*cp='\0';
return dest;
/*
//也可以直接调用已定义过的函数my_strcpy()进行赋值(拷贝)
assert(dest!=NULL&&src!=NULL);
char *cp=dest+my_strlen(dest);
my_strcpy(cp,src);
return dest;
*/
}
五、总结
完整代码:
#include<stdio.h>
#include<assert.h>
int my_strlen(const char *str){ //求字符串长度
assert(str!=NULL);
int sum=0;
while(*str!='\0'){
sum++;
str++;
}
return sum;
}
char *my_strcpy(char *dest,const char *src){ //字符串拷贝函数
assert(src!=NULL&&dest!=NULL);
char *cp=dest; //建议还是设置新的字符指针!
while(*src!='\0'){
*cp=*src;
cp++;
src++;
}
*cp='\0';
return dest;
}
char *my_strcat(char *dest,const char *src){ //字符串连接函数
assert(dest!=NULL&&src!=NULL);
char *cp=dest+my_strlen(dest); //这里是重点!
my_strcpy(cp,src);
return dest;
}
int main(){
char stra[30]={"xiaoxin"};
char strb[30]={"hello"};
char strc[30];
printf("stra:%s\n",stra);
printf("strb:%s\n",strb);
int len=my_strlen(my_strcpy(strc,my_strcat(stra,strb)));
printf("stra:%s\n",stra);
printf("strb:%s\n",strb);
printf("strc:%s\n",strc);
printf("strc len:%d",len);
return 0;
}
运行结果: