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);
}
*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,重定向写入,这样理解会大大增加做题速度。