0

这是我的问题:

编写一个反转字符串的函数 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;
    }
}

它可以完美地反转字符串。但是,我被要求用指针来做。所以从我的想法来看,首先我分配 ap 指针来获取字符串中的第一个字符。然后我分配 aq 指针以获取字符串的最后一个字符。I 循环以反转数组。但是当我试图这样做以获得最后一个字符时:

char *q = strlen(s-1);

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

更新部分

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;
}
}
4

3 回答 3

7

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

void reverse( char* str )
{
    char* end = str + strlen( str );
    while ( end > str ) {
        -- end;
        swap( *str, *end );
        ++ str;
    }
}

这样做的好处是可以正确处理空字符串和单字符串的特殊情况。也有人会争辩说它更惯用,因为它使用了一个半开放的接口,这在 C++ 中无处不在。它会让你为迭代器做好准备,迭代器总是定义半开区间(并且比指针更频繁地用于这类事情)。

于 2013-05-13T08:35:48.637 回答
2

尝试类似的东西。

char* left = &s[0];
char* right = &s[length-1];
for(; left<right ; left++, right--)
{
    c = *left;
    *left = *right;
    *right = c;
}

并阅读此http://www.cplusplus.com/doc/tutorial/pointers/

于 2013-05-13T08:14:52.723 回答
0

试试这个代码来反转字符串。

void reverse(char str[], int len)
{
    char *fptr = str;
    char *lptr = str + len -1;
    char ch = 0;
    while(fptr < lptr)
    {
            ch = *fptr;
            *fptr = *lptr;
            *lptr = ch;
            *fptr++;
            *lptr--;
    }
}
于 2013-05-13T08:50:19.297 回答