鱼C论坛

 找回密码
 立即注册
查看: 1420|回复: 9

[已解决]答案。。。

[复制链接]
发表于 2019-12-22 18:02:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

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

#define MAX 1024

int main()
{
        char str1[MAX];
        char str2[MAX];

        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;
}
最佳答案
2019-12-22 18:35:16
本帖最后由 jackz007 于 2019-12-22 18:40 编辑

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

问题

问题

运行

运行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-12-22 18:29:57 | 显示全部楼层
本帖最后由 Tec 于 2019-12-22 18:31 编辑

你的源代码也发一下啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-22 18:35:16 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2019-12-22 18:40 编辑

    如果在 linux 系统上运行,这个代码是正确的,如果是在 Windows 平台上,代码要做调整:
               if ((int)ch < 0)
               {
                       *target2++ = *target1++;
                       *target2++ = *target1++;  // 在 Windows 平台上必须删除这条语句;
               }
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-22 21:17:23 | 显示全部楼层
Tec 发表于 2019-12-22 18:29
你的源代码也发一下啊

上面就是,截图就是答案测试的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-22 21:39:02 | 显示全部楼层
jackz007 发表于 2019-12-22 18:35
如果在 linux 系统上运行,这个代码是正确的,如果是在 Windows 平台上,代码要做调整:

中文,占2个字节,是不是因为while循环下,第一步已经加一了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-23 08:56:38 | 显示全部楼层
jackz007 发表于 2019-12-22 18:35
如果在 linux 系统上运行,这个代码是正确的,如果是在 Windows 平台上,代码要做调整:

请问上面代码的37行,它应该是再字符串的末尾加结束符,但是我看不懂,能讲讲吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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 句代码就是专门做这件事情的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-23 10:38:15 | 显示全部楼层
jackz007 发表于 2019-12-23 09:13
前面的 * target2 ++ = * target1 ++ 语句每次复制完字符后,两个指针(target1、target2)都会 ...

那请问*target2='\0'是如何准确定位到末尾再加结束符的呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

    * target2 是最后复制的那个字符
    * (target2 + 1) 自然就是结束符的位置,这个很难理解吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-23 11:00:42 | 显示全部楼层
jackz007 发表于 2019-12-23 10:50
* target2 是最后复制的那个字符
    * (target2 + 1) 自然就是结束符的位置,这个很难理解吗?

好的谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-5 03:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表