【牛客 C++ 测试题】

In the main() function, after ModifyString(text) is called, what’s the value of ‘text’?

int FindSubString(char* pch){
    int   count  = 0;
    char  * p1   = pch;
    while (*p1 != '\0'){    
        if (*p1 == p1[1] - 1){
            p1++;
            count++;
        }else  {
            break;
        }
    }
    int count2 = count;
    while (*p1 != '\0'){
        if (*p1 == p1[1] + 1){
            p1++;
            count2--;
        }else  {
            break;
        }
    }
    if (count2 == 0)
        return(count);
    return(0);
}
void ModifyString(char* pText){
    char  * p1   = pText;
    char  * p2   = p1;
    while (*p1 != '\0'){
        int count = FindSubString(p1);
        if (count > 0){
            *p2++ = *p1;
            sprintf( p2, "%i", count );
            while (*p2 != '\0')  {
                p2++;
            }
            p1 += count + count + 1;
        }else  {
            *p2++ = *p1++;
        }
    }
}
void main(void){
    char text[32] = "XYBCDCBABABA";
    ModifyString(text);
    printf(text);
}  

@**1.p1++=p2++

*p1++=*p2++
c语言从右往左压栈,

  1.先计算p2++,产生对p2的一份拷贝,

  2.++操作符增加p2的值(将指针p2向后移动1个自身长度的偏移量);

  3.再计算*p2:对p2的拷贝上执行解引用;

  4.再计算p1++,产生对p1的一份拷贝,

  5.++操作符增加p1的值(将指针p1向后移动1个自身长度的偏移量);

  6.再计算*p1:对p1的拷贝上执行解引用;

  7.最后将第3步所得结果赋到第6步中的内存,即*p1=*p2;

**简单理解: 先 p1 = p2; 后 p1 + 1,p2 + 1
原文链接:https://blog.csdn.net/rentan0930/article/details/91414601

Debug实例

int main(){
    char  a[]="ABCDE";
    char  b[]="FGHTY";
    char* p1=a;
    char* p2=b;
    *p1=*p2;
    
    cout<<"p1\t"<<p1<<endl;
    cout<<"p2\t"<<p2;

}

我之前一直都理解错了,我一直都以为执行完*p1=p2;之后,p1会指向p1以及ta之后的东西,但是更换的只是指针p1的内容,

因为“”称为指针运算符,表示获取指针所指向的变量的值,这是一个一元操作符号。例如p1表示指针p1所指向的char型数据的值,也就是‘A’。

在此demo中,*p1=*p2;//就是将指针p2所指向的值‘F’替换成指针p1所指向的值,指针p1和p2所指向的地址不发生改变。

所以在程序中,*p1++=*p2++;的意思是先把指针p2所指向的值替换成指针p1所指向的值,然后指针p1和指针p2都再向后偏移一个单位。

int main(){
    char  a[]="ABCDE";
    char  b[]="FGHTY";
    char* p1=a;
    char* p2=b;
    *p1++=*p2++;

    cout<<"p1\t"<<p1<<endl;
    cout<<"p2\t"<<p2;
}

这样解释之后就很好理解此时的运行结果是:请添加图片描述

@(2.sprintf()重定向修改)
功能:把格式化的数据写入某个字符串缓冲区。
头文件:“stdio.h”
原型
int sprintf( char *buffer, const char *format, [ argument] … );
参数列表
buffer:char型指针,指向将要写入的字符串的缓冲区。
format:格式化字符串。
[argument]…:可选参数,可以是任何类型的数据。
返回值:字符串长度(strlen)

转载自https://www.cnblogs.com/zhanglibra/p/4451015.html
在原程序中sprintf( p2, “%i”, count );//将count写入指针p2中,结果如下,
在这里插入图片描述
这时,pText=“XYBCDCBA1”
之后,当再一次执行*p2++ = p1++;时,按照之前的讲解,先p1=*p2,此时,指针指示如图所示,在这里插入图片描述
所以最终,pText=“XYBCDCBA1BBA”;遇到休止符,字符串结束。

@3.总结

我们在做题时,像debug一样一步步调试显然是不科学的,整理每一个函数的意义是关键。其中,

int FindSubString(char* pch){
    int   count  = 0;
    char  * p1   = pch;
    while (*p1 != '\0'){    
        if (*p1 == p1[1] - 1){
            p1++;
            count++;
        }else  {
            break;
        }
    }
    int count2 = count;
    while (*p1 != '\0'){
        if (*p1 == p1[1] + 1){
            p1++;
            count2--;
        }else  {
            break;
        }
    }
    if (count2 == 0)
        return(count);
    return(0);
}

主要存在两个while循环,判断条件是p1 == p1[1] - 1和p1 == p1[1] + 1,!!!注意*p1 表示指针p1的内容,p1[1] - 1是也是内容上的变化(ASCII码,不是指针的偏移),简单来说,就是text这段字符串中,有多少连续相同数量的起和相同数量的落,(很多文章说就是回文,但我认为这不是标准意义的回文,所以我不叫!哈哈哈哈)
在这里插入图片描述

就像这张图一样,FindSubString这个函数就是寻找两个在同一水平高度的低点,且他们中间的字符都是连续的。也就是画横线处,count=1,重定向写入,这样理解会大大增加做题速度。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值