用C ++反转一个字符串

时间:2014-04-19 21:36:40

标签: c++ string reverse

"编写一个以字符串(字符指针)作为输入并返回字符串反转的函数。该函数应该反转字符串并将其作为函数的返回值返回。"

char *strrev(char *str) {
    char* end = str;
    char tmp = 0;

    if(str) {
        while(*end) {
            end++;
        }

        --end;

        while(end > str) {
            tmp = *end;
            *end-- = *str;
            *str++ = tmp;
        }
    }
}

我是C ++的新手。我这面临着困难。你可以请更正我的代码。

3 个答案:

答案 0 :(得分:3)

这是一个有趣的事情:

想要将此作为您的作业:/

查看 Live On Coliru

#include <string>

std::string rev(std::string x)
{
    auto a=x.begin();
    auto b=x.rbegin(); 

    while (a<b.base())
        std::swap(*a++, *b++);

    return x;
}

#include <iostream>
int main()
{
    std::cout << rev("") << "\n";
    std::cout << rev("1") << "\n";
    std::cout << rev("12") << "\n";
    std::cout << rev("123") << "\n";
    std::cout << rev("Hello world!") << "\n";
}

输出:

 
1
21
321
!dlrow olleH

答案 1 :(得分:1)

所以你的函数strrev声称会返回char *,但它会返回......嗯......没有。这意味着如果你使用这个函数的返回值,你正在读一些随机内存。在这一点上,你处于未定义行为的境界,任何事情都会发生。

您的编译器应该警告过您,并且您应该学会阅读并理解这些警告 - 它们是有原因的。如果,它没有警告你,你需要提高编译器生成的警告。

修复函数以返回正确的值后,它将按预期工作。这是一个提示:如果你想反转字符串到位那么字符串的开头在哪里可以找到内存?

答案 2 :(得分:0)

STL中有一个标准算法可以反转范围。

char *strrev(char *str) {
    const size_t n = strlen(str);
    std::reverse(str, str+n);
    return str;
}

或者更好地使用C ++字符串

void reverse(std::string& s) {
    std::reverse(s.begin(), s.end());
}