|
30鱼币
本帖最后由 是小利同学 于 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
|
最佳答案
查看完整内容
手动回答,chat2.jinshutuan.com
|