使用char数组反转String C++

Sta*_*ter 13 c++ arrays string

我写了一个简单的C++程序来反转一个字符串.我在字符数组中存储一个字符串.要反转字符串,我使用相同的字符数组和临时变量来交换数组的字符.

#include<iostream>
#include<string>
using namespace std;

void reverseChar(char* str);

char str[50],rstr[50];
int i,n;

int main()
{
    cout<<"Please Enter the String: ";
    cin.getline(str,50);
    reverseChar(str);
    cout<<str;
    return 0;
}

void reverseChar(char* str)
{
    for(i=0;i<sizeof(str)/2;i++)
    {
        char temp=str[i];
        str[i]=str[sizeof(str)-i-1];
        str[sizeof(str)-i-1]=temp;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在这个方法不起作用,我在程序执行后获得NULL String作为结果.

所以我想知道为什么我不能将字符数组等同,为什么这个程序不起作用.我可以使用什么解决方案或技巧来使相同的程序工作?

Bil*_*nch 44

sizeof(str) 不符合你的期望.

给定a char *str,sizeof(str)不会给你那个字符串的长度.相反,它将为您提供指针占用的字节数.你可能正在寻找strlen().

如果我们解决了这个问题,我们会:

for(i=0;i<strlen(str)/2;i++)
{
    char temp=str[i];
    str[i]=str[strlen(str)-i-1];
    str[strlen(str)-i-1]=temp;
}
Run Code Online (Sandbox Code Playgroud)

这是C++,使用 std::swap()

在C++中,如果要交换两个变量的内容,请使用std::swap而不是临时变量.

所以代替:

char temp=str[i];
str[i]=str[strlen(str)-i-1];
str[strlen(str)-i-1]=temp;
Run Code Online (Sandbox Code Playgroud)

你会写:

swap(str[i], str[sizeof(str) - i - 1]);
Run Code Online (Sandbox Code Playgroud)

注意那是多么清楚.

你正在使用C++,只需使用 std::reverse()

std::reverse(str, str + strlen(str));
Run Code Online (Sandbox Code Playgroud)

全局变量

如果变量不需要,那么将变量设为全局是非常糟糕的做法.特别是,我指的是i这个.

执行摘要

如果我要写这个函数,它看起来像下面两个实现之一:

void reverseChar(char* str) {
    const size_t len = strlen(str);

    for(size_t i=0; i<len/2; i++)
        swap(str[i], str[len-i-1]);
}

void reverseChar(char* str) {
    std::reverse(str, str + strlen(str));
}
Run Code Online (Sandbox Code Playgroud)

经过测试,这两个产生dlrow olleh的输入hello world.