【问题标题】:Reverse String C++ using char array使用 char 数组反转字符串 C++
【发布时间】:2014-08-13 21:07:36
【问题描述】:

我编写了一个简单的 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 字符串。

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

【问题讨论】:

  • 可以使用std::swap(str[i], str[sizeof(str)-i-1]);,而不是带有临时变量的三行代码
  • BTW c++ != c,这里有using namespace std 所以我把它改成c++
  • 即使是字符数组,std::reverse
  • sizeof(str) --> strlen(str)
  • ip 中的sizeof(ip) 是什么?

标签: c++ arrays string


【解决方案1】:

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));
}

在测试时,这两个都在hello world 的输入上产生dlrow olleh

【讨论】:

【解决方案2】:

问题是在你的函数中,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))

另一个改进,正如 cmets 中提到的,是在循环体中使用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 几乎完全做到了这一点。

【讨论】:

    【解决方案3】:
    //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;
    }
    

    【讨论】:

    • 您能否在答案中添加一个简短的描述,解释为什么您的代码与其他代码不同?如果不尝试,或者必须玩人工编译器,就不清楚了。
    【解决方案4】:

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

    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;
    }
    

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

    【讨论】:

    • 关于使用 char 数组而不是 std::string 的问题。
    【解决方案5】:
    #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];
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-07-24
      • 1970-01-01
      • 1970-01-01
      • 2022-01-08
      • 1970-01-01
      • 2015-06-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多