本帖最后由 wutianlong220 于 2021-11-15 22:18 编辑
先贴上我自己写的答案,测试有效:
- #include <stdio.h>
- #define MAX 1024
- int main(void) {
-
- char str1[MAX] = {'\0'};
- char str2[MAX] = {'\0'};
- int num;
- int start = 0;
- printf("请输入一个字符串到 str1 中:");
- fgets(str1, MAX, stdin);
-
- printf("请输入您需要拷贝的字符个数:");
- scanf("%d",&num);
-
- printf("您输入的字符是:%s\n",str1);
-
- printf("开始拷贝 str1 的内容到 str2 中...\n");
- char *str1_p = str1;
- char *str2_p = str2;
- while((start < num) && *str1_p != '\0' ) {
- int ch = (int)*str1_p;
- if (ch < 0) { //这里是专门对中文的处理,因为中文是4个字节,3个负数1个0,所以指针需要复制3次
- *str2_p++ = *str1_p++;
- *str2_p++ = *str1_p++;
- *str2_p++ = *str1_p++;
- } else {
- *str2_p++ = *str1_p++;
- }
- start++;
- }
-
- printf("拷贝完毕!\n");
- printf("现在,str2 中的内容是:%s\n",str2);
- return 0;
- }
复制代码
然后来给你解释一下
这句话到底是什么意思。
这句话的其实就是著名的代码:*p++
所谓的*p++,就是分成两个步骤:
第一,*p
第二,p++
因为p++,是先把p拿过来用,用完了以后再+1,所以整个*p++的意思就是:
p这个指针,先用*符号解引用,拿出里面的东西,然后指针p再向后面移动一位。
如果不太理解,可以点击这里:
https://www.bilibili.com/video/BV1sJ411E7St?p=87
可以参考这个视频,从12分28秒开始看,相信你会有所领悟。
懂了之后
然后我们再来看
这段代码的意思就是说:
先执行:
也就是先把target1指针,指向的内容,赋值给target2指针指向的地方,
然后:
也就是两个指针,同时向后移动一位。
懂了吧?
放在这个题目里面就相当于:
str1[0] = str2[0]
然后
str1[1] = str2[1]
然后
str1[2] = str2[2]
然后
str1[3] = str2[3]
一直这样下去。
所以就是,str2和str1这个数组,两个同时向后,一个一个去遍历,遍历一个,str2把内容给str1,然后再遍历到下一个,str2再把内容给str1,然后从数组的最初,一直折腾到指定位置,这样就完成了复制。
所以,关键在于你要记住:
*p++
这个东西,一定要牢牢记住,这个非常重要。