当n的默认值是字符串的长度时,如何反转字符串中的n个字符?

时间:2019-03-25 07:26:37

标签: c++

我需要创建reverse()函数来对str中的字符进行反向计数。 这是它的原型:

void reverse(char **str, int count = ???);

我需要为count设置默认值,以便该行完全相反。

我尝试将其分配如下:

  void reverse(char **str, int count = strlen(*str))

但是编译器显示以下错误:

error: local variable ‘str’ may not appear in this context
 void reverse(char **str, int count = (int) strlen(*str)) {

这是我的代码:


    #include <iostream>
    #include <cstring>

    using namespace std;

    void reverse(char **str, int count = (int) strlen(*str)) {
        int i;
        char temp;
        for (i = 0; i < count / 2; i++) {
            temp = (*str)[i];
            (*str)[i] = (*str)[count - i];
            (*str)[count - i] = temp;
        }
    }

    int main() {
        char buf[100];
        cout << "Enter your string:\n" << endl;
        cin >> buf;
        char *str;
        str = new char(strlen(buf)+1);
        strcpy(str, buf);

        reverse(&str);
        cout << "Reversed string:\n" << str << endl;

        return 0;
    }

我该如何处理?

3 个答案:

答案 0 :(得分:3)

根据保罗·麦肯齐的说法。您不需要指向指针的指针就可以将字符串反向转换。仅在尝试更改指针时才需要指向指针的指针。但不是,您正在尝试更改所指向的内容,因此只需一个简单的指针即可。

参数的默认值必须是常量,而不是函数调用。

然后您的算法就被淘汰了,在str[count - i]中,当i为零时,您将索引str[count]移到字符串末尾。

尝试一下

void reverse(char *str, int count = -1)
{
    if (count < 0)
        count = strlen(str);
    for (int i = 0; i < count / 2; i++)
    {
        char temp = str[i];
        str[i] = str[count - i - 1];
        str[count - i - 1] = temp;
    }
}

答案 1 :(得分:1)

由于您使用的是C ++,因此如果使用std::string而不是char *,则使用默认的整个字符串(或提供的前count个字符)进行反转变得非常简单为:

std::string reverse (const std::string& s, size_t count = 0)
{
    if (count > s.length())
        count = 0;
    if (count)
        count = s.length() - count;
    return std::string (s.rbegin() + count, s.rend());
}

一个简短的例子是:

#include <iostream>
#include <string>

std::string reverse (const std::string& s, size_t count = 0)
{
    if (count > s.length())
        count = 0;
    if (count)
        count = s.length() - count;
    return std::string (s.rbegin() + count, s.rend());
}

int main (void)
{
    std::string s("123456789");
    std::string r = reverse(s);
    std::cout << "s\n" << s << "\n\nreverse(s)\n" << r 
                << "\n\nreverse(s, 2)\n";
    r = reverse(s, 2);
    std::cout << r << "\n\nreverse(s, s.length() - 1)\n";
    r = reverse(s, s.length() - 1);
    std::cout << r << '\n';
}

(请参阅:std::basic_string::rend, std::basic_string::crendstd::basic_string::rbegin, std::basic_string::crbegin

使用/输出示例

$ ./bin/strrev
s
123456789

reverse(s)
987654321

reverse(s, 2)
21

reverse(s, s.length() - 1)
87654321

始终打印完整字符

如果您只想反转count字符,而只打印反转的结果字符串的全长,则可以执行以下操作:

std::string reverse (const std::string& s, size_t count = 0)
{
    if (count > s.length())
        count = 0;
    if (count) {
        count = s.length() - count;
        return std::string (s.rbegin() + count, s.rend()) + suffix;
    }
    return std::string (s.rbegin() + count, s.rend());
}

所有字符

$ ./bin/strrev
s
123456789

reverse(s)
987654321

reverse(s, 2)
213456789

reverse(s, s.length() - 1)
876543219

与使用基本类型相比,容器库具有许多优点。

答案 2 :(得分:0)

所以它应该这样工作:

#include <iostream>
#include <cstring>

using namespace std;

void reverse(char *str) {
    int count = (int)strlen(str);
    char temp;
    for (int i = 0; i < count / 2; i++) {
        temp = str[i];
        str[i] = str[count - i-1];
        str[count - i-1] = temp;
    }
}

int main() {
    char buf[100];
    cout << "Enter your string:\n" << endl;
    cin >> buf;
    char *str;
    str = new char(strlen(buf)+1);
    strcpy(str, buf);

    reverse(str);
    cout << "Reversed string:\n" << str << endl;

    return 0;
}

您只需要给函数提供字符串,而不是给字符串的指针。字符**太多,您可以更改字符,因为您已经有一个字符*指针。如果您不将字符串的长度提供给函数,则您不会犯任何错误。我反向调用strlen函数,这会增加一个O(n)的时间复杂度,这并不是有问题的,因为您的函数已经在O(n)中运行。如果您想知道为什么我使用str [count -i-1],那是因为cString是0终止的,这意味着字符串“ hallo”实际上是“” hallo \ 0“,带有-1字面量,请确保不要更改终止cString所需的此'\ 0'。