使用char数组反转String C ++

时间:2014-06-23 18:05:39

标签: 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;
    }
}

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

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

5 个答案:

答案 0 :(得分:44)

sizeof(str)没有达到您的预期。

鉴于char *strsizeof(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;
}

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

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

所以而不是:

char temp=str[i];
str[i]=str[strlen(str)-i-1];
str[strlen(str)-i-1]=temp;

你只需写:

swap(str[i], str[sizeof(str) - i - 1]);

注意那是多么清楚。

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

std::reverse(str, str + strlen(str));

全局变量

如果变量不是必需的话,将变量变为全局变量的做法非常糟糕。特别是,我指的是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));
}

经过测试,这两项都会在dlrow olleh的输入上生成hello world

答案 1 :(得分:0)

问题是在你的函数中,str不是数组而是指针。因此sizeof将获得指针的大小,而不是它指向的数组的长度。此外,即使它给你数组的大小,这不是字符串的长度。为此,请更好地使用strlen

为避免多次调用strlen,请为函数提供另一个参数,该参数指示长度:

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

并用

调用它

reverseChar(str, strlen(str))

评论中提到的另一项改进是在循环体中使用std::swap

void reverseChar(char* str, int len)
{
    for(i=0; i<len/2; i++)
    {
        std::swap(str[i], str[len-i-1]);
    }
}

此外,还有std::reverse几乎就是这样。

答案 2 :(得分:-1)

//reverse a string
#include<iostream>
using namespace std;

int strlen(char * str) {
  int len = 0; 
  while (*str != '\0') {
    len++;
    str++;
  }
  return len;
}

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

int main() {
  char str[100];
  cin.getline(str,100);
  reverse(str, strlen(str));
  cout<<str<<endl;
  getchar();
  return 0;
}

答案 3 :(得分:-2)

如果我是你,我会这样写:

int main()
{
    string str;
    cout << "Enter a string: " << endl;
    getline(cin, str);
    for (int x = str.length() - 1; x > -1; x--)
    {
        cout << str[x];
    }
    return 0;
}

这是一种非常简单的方法,并且效果很好。

答案 4 :(得分:-2)

#include <iostream>
#include <cstdio>

using namespace std;

int main()
{
    char str[80];
    cout << "Enter a string bro: \n";
    gets_s(str);

    for (int i = strlen(str) - 1; i > -1; i--)
    {
        cout << str[i];
    }
}