返回一个指向char数组的指针.如何打印出数组的全部内容

returning a pointer that points to char array. How do i print out the entire contents of the array?

本文关键字:数组 何打印 打印 全部 指针 一个 返回 char      更新时间:2023-10-16

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

#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::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] = '';
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

您返回的是一个char而不是char*。字符总是只有一个字符。如果您想取回一个字符串,请返回一个字符串或char*。

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

您可以做两件事。您可以选择返回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;  
}

代码不言自明。

您的函数被设置为返回单个字符char,这就是您所做的,您通过取消引用指向char数组第一个元素的revBuffer指针,返回了反转字符串的第一个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 = '';
//return a pointer to the reversed string
return revBuffer;
}