为什么字符串结尾有两个空格??

 #if 1
#include<stdlib.h>
#include<iostream>
using namespace std;
char* Reverse(char* s)
{
    //将q指向字符串最后一个字符
    char* q = s ;
    int j=0;
    while( *q++ ) 
    {
        j++;
    }
    cout<<j<<endl;
    q-=2;//为何要减去2?

    //分配空间,存储逆序后的字符串。
    char* p = new char[sizeof(char) * (q - s + 2)] ; 
    char* r = p ;

    // 逆序存储
    while(q >= s)
        *p++ = *q-- ;
    *p = '\0' ;

    return r ;
} 
int main()
{char *m="1234567";
    char *n=Reverse(m);
    cout<<n<<endl;
    system("pause");
    return 0;

代码运行无问题,功能已实现了逆序。但是调试的时候发现while中居然有两次空格,请求帮忙解答。

没看懂你要问啥?至于指针q为何减2,是因为while(*q++)循环后,q指针后移了一位,并且要去掉 '\0’的位置故q还得减1,即q-2。

当q指向'0'时,还要执行一次++,然后while循环结束

 *q++  ==>   取 a=*q ,   再 q+=1 , 然后返回 a 的值. 这个是 指针加1
 也就是1234567这个字符串
    1           2          3         4             5                6                  7              ‘\0
 地址1     地址2   地址3   地址4      地址5         地址6            地址7          地址8        地址9

 当值为7的时候,地址已经指向地址8了,当值为\0结束while循环的时候,地址已经指向地址9了,为了指向地址7,就要地址减2