∞可能 2022-10-10 10:56 采纳率: 92.9%
浏览 43
已结题

请帮我解释一下,我不知道怎么回事。

zip函数是怎样将重复的字符化成一个数字字符(重复的个数)加一个字符(重复的),就是如果输入‘111’(四个字符)它是怎样输出‘31’(两个字符)的,是怎么由输入3个字符只输出两个字符。求解答详细。谢谢😊。

img

  • 写回答

2条回答 默认 最新

  • 关注

    while( *p == *(p+n)) n++;这一句统计连续出现的字符个数。写个例子来给你描述过程。
    举例执行过程如下:

    
    假设输入的字符串是1112222
    p和q开始都指向字符串的第一个位置,
    while (*p != '\0')这里遍历整个字符串
    
    n = 1; 每次统计字符个数的时候重置为1
    
    while (*p == *(p + n)) n++; 这里的执行过程为:
    * p 为'1', * (p + 1)也是'1',n++,n变为2
    * p 为'1', * (p + 2)也是'1',n++,n变为3
    * p 为'1', * (p + 3)是'2',循环结束,也就是'1'的个数为3
    
    执行 else if (n >= 2)代码块:* q++ = n + '0'; 
    q初始指向'1',n + '0' = '3',所以这句代码把原来的字符串修改为:3112222
    然后q 后移1位,q执行字符串的第二个位置
    执行 * q++ = *(p + n - 1);执行过程为:
    *q = *(p+3-1),此时,q指向字符串第二个位置,p还是指向开始的位置,这句话的作用就是把本次统计的字符放在字符串的第二个位置,
    字符串变为: 3112222
    q++,q指向字符串的第三个位置;
    p= p+n,p移动3位,此时指向字符'2',然后重新开始累计。
    
    while (*p == *(p + n)) n++; 这里的执行过程为:
    * p 为'2', * (p + 1)也是'2',n++,n变为2
    * p 为'2', * (p + 2)也是'2',n++,n变为3
    * p 为'2', * (p + 3)也是'2',n++,n变为4
    * p 为'2', * (p + 4)是'3',循环结束,也就是'2'的个数为4
    
    执行 else if (n >= 2)代码块:* q++ = n + '0';
    q指向字符串的第三个位置'1',n + '0' = '4',所以这句代码把原来的字符串修改为:3142222
    然后q 后移1位,q执行字符串的第四个位置
    
    执行* q++ = *(p + n - 1); 执行过程为:
    * q = *(p + 4 - 1), 此时,q指向字符串第四个位置,p+3指向了最后一个'2',这句话的作用就是把本次统计的字符'2'放在字符串的第四个位置,
    字符串变为 : 3142222
    q++,q指向字符串的第五个位置;
    p = p + n,p移动3位,此时指向字符串的末尾'\0',此时while(*p != '\0')不成立,循环结束
    
    执行*q = '\0',也就是把字符串的第五位设为'\0',来让字符串正确结束,字符串变为:3142
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 10月18日
  • 已采纳回答 10月10日
  • 创建了问题 10月10日

悬赏问题

  • ¥15 苹果系统的mac m1芯片的笔记本使用ce修改器使用不了
  • ¥15 单相逆变的电压电流双闭环中进行低通滤波PID算法改进
  • ¥15 关于#java#的问题,请各位专家解答!
  • ¥15 如何卸载arcgis 10.1 data reviewer for desktop
  • ¥15 共享文件夹会话中为什么会有WORKGROUP
  • ¥15 关于#python#的问题:使用ATL02数据解算光子脚点的坐标(操作系统-windows)
  • ¥115 关于#python#的问题:未加密前两个软件都可以打开,加密后只有A软件可打开,B软件可以打开但读取不了数据
  • ¥15 在matlab中Application Compiler后的软件无法打开
  • ¥15 想问一下STM32创建工程模板时遇到得问题
  • ¥15 Fiddler抓包443