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

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

img

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

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632