本帖最后由 是小利同学 于 2023-6-4 23:30 编辑
求助鱼友答疑
【先欣赏张美图,静静心!】
3
在自定义字符串处理函数时遇到一些困难!!
【话不多说先上代码】
【1.自定义比较字符串函数 mycmp()】
#include<stdio.h>
#include<string.h>
int mycmp1(const char* s1,const char* s2);
int mycmp2(const char* s1,const char* s2);
int main(int argc,char const *argv[]){
char s1[] = "abc";
char s2[] = "Abc";
printf("mycmp1(s1,s2) = %d\n",mycmp1(s1,s2));
printf("mycmp2(s1,s2) = %d\n",mycmp2(s1,s2));
return 0;
}
/*
@@自定义比较字符串函数 mycmp()
mycmp1() 数组的方式实现
mycmp2() 指针的方式实现
@比较两个字符串大小
1.若s1等于s2,若字符串长度相等,且每一个字符都对应相等,则返回0
2.若s1大于s2,依次比较s1s2的每个字符,若存在s1的字符>s2的字符,且是第一次出现,返回这两个字符的差值(正数 ) ,结束比较
3若s1小于s2,依次比较s1s2的每个字符,若存在s1的字符<s2的字符,且是第一次出现,返回这两个字符的差值(负数) ,结束比较
*/
int mycmp1(const char* s1,const char* s2){
int index = 0;
while(s1[index] == s2[index] && s1[index] != '\0'){
index++;
}
return s1[index] - s2[index];
}
int mycmp2(const char* s1,const char* s2){
while(*s1 == *s2 && *s1 != '\0'){
s1++;
s2++;
}
return *s1 - *s2;
}
/**
@为什么循环不能写成while(*s1++ == *s2++ && *s1 != '\0'); 为什么呢?
->我的猜想如下:
1.首先,s1++ == *s2++是一个判断语句,因为这时s1++、s2++只是做判断使用,没有赋值给新的指针保存,并没有真正的移动指针,
所以无论s1,s2如何自增自减,s1,s2还是指向原来的地址
(ps:我感觉这时的s1++或者s1--;和s1+1,s1-1效果一样(而不是s1 = s1 + 1;),只是借助s1,读了s1的下一位,并没有移动s1的指向)
*/
【问题1】
1.上述代码中,为什么while循环不能写成while(*s1++ == *s2++ && *s1 != '\0'); 为什么呢?(ps:代码中有我的猜测,请指出错误)
【2.自定函数mycpy()复制字符串】
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char *mycpy1(char* dst,const char* src);
char *mycpy2(char* dst,const char* src);
int main(int argc,char const *argv[]){
char src[] = "Hello world!";
char *dst = (char*)malloc(strlen(src)+1);//sizeof(char)*sizeof(src)
printf("mycpy1(dst,src) = %s\n",mycpy1(dst,src));
printf("mycpy2(dst,src) = %s\n",mycpy2(dst,src));
return 0;
}
/**
@自定函数
mycpy(),复制字符串
mycpy1() 数组的方式实现
mycpy2() 指针的方式实现
*/
char *mycpy1(char* dst,const char* src){
int inx = 0 ;
while(src[inx]){//src[inx] != '\0'
dst[inx] = src[inx];
inx++;
}
dst[inx] = '\0';//dst[inx] = src[inx];
return dst;
}
char *mycpy2(char* dst,const char* src){
char * ret = dst;
while(*dst++ = *src++);
*dst = '\0';//*dst = *src
return ret;
}
/**
@这里 *dst++ = *src++ 指针为什么又可以通过 自增自减 来移动指针?
我的猜想如下:
1、 首先,*dst++ = *src++ 这是一个赋值运算,先看指针src自增并取值后,赋值给了*dst,正是因为赋值运算,使得指针src可以移动
2、而*dst++,显然这一个可以运算的式子,但同时它也是一个左值,是一个变量,正因为如此,使得指dst的自增运算可以被变量保存
(ps:我感觉这时的指针dst或着指针src可以自增,关键在于有了个左值,以及赋值运算符,保存了指针的自增)
*/
/**
@@mycpy2() 指针的方式实现,三种不同的循环写法
@1
while(*src != '\0'){
*dst = *src;
dst++;
src++;
}
@2
while(*src){
*dst++ = *src++;
}
@3
while(*dst++ = *src++);
*/
【问题2】
2.上述代码中,@这里 *dst++ = *src++ 指针为什么又可以通过 自增自减 来移动指针? 为什么呢?(ps:代码中有我的猜测,请指出错误)
【3.@自定函数mycat()复制字符串】
#include<stdio.h>
#include<string.h>
char * mycat1(char *dst,const char *src);
char * mycat2(char *dst,const char *src);
int main(int argc,char const *argv[]){
char dst[] = "Hello ";
char src[] = "world!";
// printf("mycat1(dst,src) = %s\n",mycat1(dst,src));
printf("mycat2(dst,src) = %s\n",mycat2(dst,src));
return 0;
}
/**
@自定函数
mycat(),复制字符串
mycat1() 数组的方式实现
mycat2() 指针的方式实现
*/
char * mycat1(char *dst,const char *src){
int inx = 0;
int dstlen = strlen(dst);
while(src[inx] != '\0'){
dst[dstlen+inx] = src[inx];
inx++;
}
dst[dstlen+inx] = '\0';
return dst;
}
char * mycat2(char *dst,const char *src){
char *ret = dst;
dst = dst + strlen(dst);
while(*dst++ = *src++);
*dst = '\0';
return ret;
}
【问题3】
3.上述几个程序中有相同的代码while(*dst++ = *src++); *dst = '\0'; 这里想问该while(*dst++ = *src++);循环最后一次是否将*dst赋值 '\0' ?下面一行的*dst = '\0';是否多余?
期待各位鱼友和大佬们的解答,感谢!
手动回答,chat2.jinshutuan.com
|