最后的魁拔 发表于 2019-12-22 18:02:42

答案。。。

本帖最后由 最后的魁拔 于 2019-12-22 18:03 编辑

输入我爱lol,拷贝个数3,全都拷贝了,代码是答案的
#include <stdio.h>

#define MAX 1024

int main()
{
      char str1;
      char str2;

      char *target1 = str1;
      char *target2 = str2;

      char ch;
      int n;

      printf("请输入一个字符串到 str1 中:");
      fgets(str1, MAX, stdin);

      printf("请输入需要拷贝的字符个数:");
      scanf("%d", &n);

      printf("开始拷贝 str1 的内容到 str2 中...\n");
      while (n--)
      {
               ch = *target2++ = *target1++;
               if (ch == '\0')
               {
                     break;
               }
               if ((int)ch < 0)
               {
                     *target2++ = *target1++;
                     *target2++ = *target1++;
               }
      }

      *target2 = '\0';

      printf("拷贝完毕!\n");
      printf("现在,str2 中的内容是:%s\n", str2);

      return 0;
}

Tec 发表于 2019-12-22 18:29:57

本帖最后由 Tec 于 2019-12-22 18:31 编辑

你的源代码也发一下啊

jackz007 发表于 2019-12-22 18:35:16

本帖最后由 jackz007 于 2019-12-22 18:40 编辑

    如果在 linux 系统上运行,这个代码是正确的,如果是在 Windows 平台上,代码要做调整:
               if ((int)ch < 0)
               {
                     *target2++ = *target1++;
                     *target2++ = *target1++;// 在 Windows 平台上必须删除这条语句;
               }

最后的魁拔 发表于 2019-12-22 21:17:23

Tec 发表于 2019-12-22 18:29
你的源代码也发一下啊

上面就是,截图就是答案测试的

最后的魁拔 发表于 2019-12-22 21:39:02

jackz007 发表于 2019-12-22 18:35
如果在 linux 系统上运行,这个代码是正确的,如果是在 Windows 平台上,代码要做调整:

中文,占2个字节,是不是因为while循环下,第一步已经加一了

最后的魁拔 发表于 2019-12-23 08:56:38

jackz007 发表于 2019-12-22 18:35
如果在 linux 系统上运行,这个代码是正确的,如果是在 Windows 平台上,代码要做调整:

请问上面代码的37行,它应该是再字符串的末尾加结束符,但是我看不懂,能讲讲吗?

jackz007 发表于 2019-12-23 09:13:33

本帖最后由 jackz007 于 2019-12-23 09:17 编辑

最后的魁拔 发表于 2019-12-23 08:56
请问上面代码的37行,它应该是再字符串的末尾加结束符,但是我看不懂,能讲讲吗?

      前面的 * target2 ++ = * target1 ++ 语句每次复制完字符后,两个指针(target1、target2)都会步进,如果是通过条件 if(ch == '\n') 结束的循环,那么,字符复制已经覆盖了结束标志,就是说,str1 的结束符已经拷贝到 str2 中;但是,如果是通过 while (n --) 结束的循环,字符复制肯定还没有能够覆盖到结束符,这个时候,显然就必需专门为 str2 添加字符串结束符了,第 37 句代码就是专门做这件事情的。

最后的魁拔 发表于 2019-12-23 10:38:15

jackz007 发表于 2019-12-23 09:13
前面的 * target2 ++ = * target1 ++ 语句每次复制完字符后,两个指针(target1、target2)都会 ...

那请问*target2='\0'是如何准确定位到末尾再加结束符的呢

jackz007 发表于 2019-12-23 10:50:03

最后的魁拔 发表于 2019-12-23 10:38
那请问*target2='\0'是如何准确定位到末尾再加结束符的呢

    * target2 是最后复制的那个字符
    * (target2 + 1) 自然就是结束符的位置,这个很难理解吗?

最后的魁拔 发表于 2019-12-23 11:00:42

jackz007 发表于 2019-12-23 10:50
* target2 是最后复制的那个字符
    * (target2 + 1) 自然就是结束符的位置,这个很难理解吗?

好的谢谢
页: [1]
查看完整版本: 答案。。。