在C++中反转一个字符串

Reverse a string in place in C++

本文关键字:一个 字符串 C++      更新时间:2023-10-16

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

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++新手。我在这方面遇到了困难。你能纠正我的代码吗。

这里有一个有趣的:

您将希望将其作为您的任务:/

查看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

因此,您的函数strrev声称返回char *,但它返回。。。好没有什么这意味着,如果你使用这个函数的返回值,你正在读取一些随机内存。在这一点上,你处于未定义行为的领域,任何事情都会发生。

你的编译器应该已经警告过你这一点,你应该学会阅读和理解这些警告——它们存在是有原因的。如果它可能没有警告您,您需要启动编译器生成的警告。

一旦您修复了函数以返回正确的值,它就会按预期工作。这里有一个提示:如果你想在的位置反转字符串,那么字符串的开头在内存中的位置是什么?

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());
}
相关文章: