在指针中反转数组

Yvo*_*nne 0 c++ pointers for-loop

这是我的问题:

编写一个反转字符串的函数void reverse(char s []).例如,"Harry"变成"yrraH".

这是我的代码:

void reverse(char s[]);
int main()
{
    char s [] = "Harry";
    reverse(s);
    cout << s << endl;

    system("PAUSE");
    return 0;
}

void reverse(char s[])
{
    int length = strlen(s);
    int c, i ,j;

    for(int i=0, j=length-1 ; i<j ; i++, j--)
    {
        c = s[i];
        s[i] = s[j];
        s[j] = c;
    }
}
Run Code Online (Sandbox Code Playgroud)

它可以完美地扭转字符串.但是,我被要求用指针做.所以根据我的想法,首先我指定ap指针来获取字符串中的第一个char.然后我分配一个指针来获取字符串的最后一个字符串.I循环通过反转阵列.但是当我试图这样做以获得最后一个字符时:

char *q = strlen(s-1);
Run Code Online (Sandbox Code Playgroud)

我收到了一个错误.有人可以帮我用指针解决这个问题吗?

更新部分

if (strlen(s) > 0(
{
char* first = &s[0];
char*last = &s[strlen(s)-1];
while(first < last)
{
char temp = *first;
*first = *last;
*last = temp;
++first;
--last;
}
}
Run Code Online (Sandbox Code Playgroud)

Jam*_*nze 7

请注意,Bartosz Marcinkowski的答案可能就是您的导师正在寻找的答案.但我写这个的方式是:

void reverse( char* str )
{
    char* end = str + strlen( str );
    while ( end > str ) {
        -- end;
        swap( *str, *end );
        ++ str;
    }
}
Run Code Online (Sandbox Code Playgroud)

这具有正确处理空字符串和单个字符串的特殊情况的优点.人们也可以争辩说它更惯用,因为它使用半开放接口,这在C++中无处不在.它将为迭代器做好准备,迭代器总是定义半开的间隔(并且比这些事物的指针使用频率更高).