转换为C样式字符串

时间:2017-09-27 22:38:41

标签: c++ string algorithm reverse

我正在尝试创建一个接受字符串的函数,将其反转,这都是在main中完成的。这是我到目前为止所拥有的。

#include <cstring>
#include <iostream>
#include <string>


std::string str = "zombie";


void Reverse( std::string a)
{

    char* a1 = a.c_str;
    char* a2;

    for (int i = (strlen(a1) -1); a1[i]!=0; i--)
    {
        a2 += a1[i];
    }

    str = a2;
}

int main()
{
    Reverse(str);

    std::cout << str << std::endl;
}

但我一直收到这个错误。我不能在这个问题中使用指针。有什么建议吗?

编辑:我特别遇到将插入参数a转换为c风格字符串的问题。

编辑2:所以我开始清理它,根据我的理解,即使进行了适当的更改,我所拥有的代码根本无法实现我的目标。这会走上更好的轨道吗?我计划在将字符串传递给函数之前将字符串转换为c样式。

void Reverse(const char* s)
{
    int x = strlen(s);
    std::string str = "";

    for (int c = x; c > 0; c--)
    {
        str += s[c];
    }

}

1 个答案:

答案 0 :(得分:0)

该功能完全无效。

例如,参数应声明为std::string &

当函数依赖于全局变量时,这是一个坏主意。

在本声明中

char* a1 = a.c_str;

有两个错误。首先,而不是a.c_str必须有a.c_str()。成员函数c_str返回一个常量指针。

这个指针

char* a2;

具有不确定的价值。

因此,到目前为止,您还不知道如何使用C ++编写函数,那么我将只展示其实现的几种变体。

最简单的是以下

#include <iostream>
#include <string>

std::string & Reverse( std::string &s )
{
    s.assign(s.rbegin(), s.rend());

    return s;
}


int main()
{
    std::string s = "zombie";

    std::cout << s << std::endl;
    std::cout << Reverse(s) << std::endl;

    return 0;
}

该函数使用class std::string的反转迭代器。

另一种方法是使用标题std::reverse

中声明的标准算法<algorithm>
#include <iostream>
#include <string>
#include <algorithm>

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

    return s;
}

int main()
{
    std::string s = "zombie";

    std::cout << s << std::endl;
    std::cout << Reverse(s) << std::endl;

    return 0;
}

如果你想使用循环自己编写函数,那么它的实现看起来像

#include <iostream>
#include <string>


std::string & Reverse(std::string &s)
{
    for (std::string::size_type i = 0, n = s.size(); i < n / 2; i++)
    {
        //std::swap(s[i], s[n - i - 1]);
        char c = s[i];
        s[i] = s[n - i - 1];
        s[n - i - 1] = c;
    }

    return s;
}

int main()
{
    std::string s = "zombie";

    std::cout << s << std::endl;
    std::cout << Reverse(s) << std::endl;

    return 0;
}

在所有三种情况下,程序输出看起来像

zombie
eibmoz

您也可以尝试使用迭代器(双向或随机)而不是索引来自己编写函数。