返回指向char数组的指针。如何打印出阵列的全部内容?

时间:2017-11-16 21:51:29

标签: c++ string pointers reverse

这个程序会反转一个给定的字符串,但我似乎无法弄清楚如何返回整个缓冲区,欢迎所有答案。

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

char  ReverseString(char *input);

int main()
{
    string str;
    cout << "Please Enter a String: ";
    getline(cin,str);
    cout << "The string you entered is: " << str << endl;
    str = ReverseString(&str[0]);
    cout << str;
}

char  ReverseString(char* input)
{
    int size = strlen(input);
    char *it;
    char *revBuffer = new char[size];
    it = revBuffer;
    for(int i=0; i<size; i++)
    {
       *it = input[(size-1)-i];
       it++;
    }
    return *revBuffer; // 

我似乎无法弄清楚如何返回整个缓冲区而不是指针指向的一个元素。

5 个答案:

答案 0 :(得分:0)

您正在返回char而不是char *。 char总是只是一个字符。如果要返回字符串,则返回字符串或char *。

答案 1 :(得分:0)

你已经在使用std :: string了,为什么不用它来反转字符串呢?

#include <iostream>
#include <string>

std::string ReverseString(std::string const &str)
{
    return std::string(str.crbegin(), str.crend());
}

int main()
{
    std::string str("1234");
    std::cout << ReverseString(str);

    return 0;
}

打印

4321

答案 2 :(得分:0)

你可以做两件事。您可以选择返回char *。代码如下:

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

char  *ReverseString(char *input);

int main()
{
    string str;
    cout << "Please Enter a String: ";
    getline(cin,str);
    cout << "The string you entered is: " << str << endl;
    str = ReverseString(&str[0]);
    cout << str;
}

char *ReverseString(char* input)
{
    int size = strlen(input);
    char *it;
    char *revBuffer = new char[size];
    it = revBuffer;
    for(int i=0; i<size; i++)
    {
       *it = input[(size-1)-i];
       it++;
    }
    return revBuffer;
}

或者,您只能在功能中打印字符串。代码是:

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

void  ReverseString(char *input);

int main()
{
    string str;
    cout << "Please Enter a String: ";
    getline(cin,str);
    cout << "The string you entered is: " << str << endl;
    ReverseString(&str[0]);

}

void  ReverseString(char* input)
{
    int size = strlen(input);
    char *it;
    char *revBuffer = new char[size];
    it = revBuffer;
    for(int i=0; i<size; i++)
    {
       *it = input[(size-1)-i];
       it++;
    }
    cout << revBuffer;  
}

代码不言自明。

答案 3 :(得分:0)

对于初学者来说,声明类型std::string的对象然后尝试将其作为字符数组反转是没有意义的。

此外,包含标准C函数声明的标题名为<cstring>

此外,您还需要包含包含类std::string定义的标头。

所以标题应该是

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

然而,出现了一个问题:为什么不使用std::string类型的相同对象而不是将其解释为字符数组?

即使要编译它,你的方法在任何情况下都有错误。由于这个声明

str = ReverseString(&str[0]);

存在内存泄漏。而且返回的字符串不是以零结尾的。

因此程序有不确定的行为。

实际上,您要做的是以相反的顺序将一个字符串复制到另一个字符串中。

使用std::string类型的对象,任务可以在一行中完成。

例如

#include <iostream>
#include <string>

int main()
{
    std::string s("Hello, World!");
    std::string t( s.rbegin(), s.rend() );

    std::cout << s << std::endl;
    std::cout << t << std::endl;

    return 0;
}

程序输出

Hello, World!
!dlroW ,olleH

如果要反转原始字符串,则可以编写

#include <iostream>
#include <string>

int main()
{
    std::string s("Hello, World!");

    std::cout << s << std::endl;

    s.assign( s.rbegin(), s.rend() );

    std::cout << s << std::endl;

    return 0;
}

您可以通过以下方式编写单独的函数

#include <iostream>
#include <string>

std::string ReverseCopyString( const std::string &s )
{
    return { s.rbegin(), s.rend() };
}

int main()
{
    std::string s("Hello, World!");
    std::string t = ReverseCopyString( s );

    std::cout << s << std::endl;
    std::cout << t << std::endl;

    return 0;
}

考虑到有标准算法std::reverse_copy执行相同的任务。或者,如果要反转原始字符串,则可以使用算法std::reverse

例如

#include <iostream>
#include <string>
#include <iterator>
#include <algorithm>

int main()
{
    std::string s("Hello, World!");
    std::string t;
    t.reserve(s.size());

    std::reverse_copy(s.begin(), s.end(), std::back_inserter(t));

    std::cout << s << std::endl;
    std::cout << t << std::endl;

    return 0;
}

如果要处理字符数组,则原始字符串也应存储在字符数组中。

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

char * ReverseCopyString(const char *s)
{
    size_t n = std::strlen(s);

    char *t = new char[n + 1];

    size_t i = 0;

    for (; i != n; i++) t[i] = s[n - 1 - i];

    t[i] = '\0';

    return t;
}

int main()
{
    const size_t N = 100;
    char s[N];

    std::cout << "Please Enter a String: ";
    std::cin.getline(s, sizeof( s ) );

    std::cout << "The string you entered is: " << s << std::endl;

    char *t = ReverseCopyString( s );

    std::cout << t << std::endl;

    delete []t;

    return 0;
}

程序输出可能看起来像

Please Enter a String: Hello, World!
The string you entered is: Hello, World!
!dlroW ,olleH

答案 4 :(得分:-1)

您的功能设置为返回单个字符char以及您已完成的操作,您已通过取消引用{返回了反向字符串的第一个字符{1}}指针,它是指向char数组的第一个元素的指针。

您需要做的是将函数设置为返回指针revBuffer而不是char*,这样您就可以返回char

所以你的代码应该是这样的:

revBuffer