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

C++ 返回指向char数组的指针。如何打印阵列的全部内容?,c++,string,pointers,reverse,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

这个程序反转给定的字符串,但我似乎不知道如何返回整个缓冲区,欢迎所有答案

#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; // 
#包括
#包括
使用名称空间std;
字符反向限制(字符*输入);
int main()
{
字符串str;

cout您返回的是一个字符而不是一个字符*。一个字符始终只是一个字符。如果您想返回一个字符串或一个字符*

您的函数设置为返回一个字符
char
,这就是您所做的,您已经通过取消引用
revbuff返回了反转字符串的第一个字符r
指针,它是指向char数组第一个元素的指针

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

因此,您的代码应该如下所示:

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

//Function return a char pointer instead of a char
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+1];
    it = revBuffer;
    for(int i=0; i<size; i++)
    {
       *it = input[(size-1)-i];
       it++;
    }
    *it = '\0';
    //return a pointer to the reversed string
    return revBuffer;
}
#包括
#包括
使用名称空间std;
//函数返回一个char指针,而不是char指针
字符*反向限制(字符*输入);
int main()
{
字符串str;

cout您已经在使用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;
}

您可以做两件事。您可以选择返回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;
}
#包括
#包括
使用名称空间std;
字符*反向限制(字符*输入);
int main()
{
字符串str;

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

此外,包含标准C函数声明的头被命名为

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

所以标题应该是

#include <iostream>
#include <string>
#include <cstring>
内存泄漏。而且返回的字符串不是以零结尾的

因此,程序具有未定义的行为

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

使用类型为
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;
}
#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>

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

char*ReverseString(char*input)
return revBuffer
;或者-更好-返回
std::string
。您正在泄漏
char[]
。不要使用字符数组,在任何地方都使用std::strings。嘿,所以我修复了返回字符*的函数,但是现在当我打印到控制台时,我得到了带有其他一些随机字符的反向字符串。这可能是我的指针算术吗?我看不出有任何错误。非常感谢。这是因为您没有添加NULL终止字符racter
\0
在反向字符串的结尾处。@monkhii添加了空终止字符,请再次检查代码。谢谢,有没有办法不用使用std::string来执行此操作?谢谢回答。我选择使用第一种方法返回字符*。现在程序打印反向字符串,但也打印一些随机字符字符。以下是一些输出。请输入字符串:hi输入的字符串是:hi ih。▒非常感谢,你的解释很容易理解。
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;
}
#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