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