返回指向 char 数组的指针。我如何打印出数组的全部内容?
returning a pointer that points to char array. How do i print out the entire contents of the array?
这个程序反转给定的字符串,但我似乎无法弄清楚如何 return 整个缓冲区,欢迎所有答案。
#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; //
我似乎无法弄清楚如何 return 整个缓冲区而不是指针指向的一个元素。
您正在 return 使用 char 而不是 char*。 char 始终只是一个字符。如果你想得到一个字符串 return 一个字符串或一个 char*.
您的函数设置为 return 单个字符 char
这就是您所做的,您已经 return 通过 de-引用 revBuffer
指针,它是指向 char 数组第一个元素的指针。
你需要做的是将函数设置为 return 指针 char*
而不是 char
这样你就可以 return 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 = '[=10=]';
//return a pointer to the reversed string
return revBuffer;
}
您已经在使用 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
你可以做两件事。或者你可以选择 return 一个 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;
}
代码不言自明。
对于初学者来说,声明 std::string
类型的 object 然后尝试将其反转为字符数组是没有意义的。
此外,包含标准 C 函数声明的 header 被命名为 <cstring>
。
您还需要包括包含 class std::string
.
定义的 header
所以 header 应该是
#include <iostream>
#include <string>
#include <cstring>
然而一个问题出现了:为什么不使用类型 std::string
的相同 object 而不是将其解释为字符数组?
你的方法即使编译也有问题。由于这个声明
str = ReverseString(&str[0]);
存在内存泄漏。而且返回的字符串不是 zero-terminated.
因此程序有未定义的行为。
事实上,您要做的是将一个字符串以相反的顺序复制到另一个字符串中。
使用 object 类型的 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] = '[=17=]';
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
这个程序反转给定的字符串,但我似乎无法弄清楚如何 return 整个缓冲区,欢迎所有答案。
#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; //
我似乎无法弄清楚如何 return 整个缓冲区而不是指针指向的一个元素。
您正在 return 使用 char 而不是 char*。 char 始终只是一个字符。如果你想得到一个字符串 return 一个字符串或一个 char*.
您的函数设置为 return 单个字符 char
这就是您所做的,您已经 return 通过 de-引用 revBuffer
指针,它是指向 char 数组第一个元素的指针。
你需要做的是将函数设置为 return 指针 char*
而不是 char
这样你就可以 return 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 = '[=10=]';
//return a pointer to the reversed string
return revBuffer;
}
您已经在使用 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
你可以做两件事。或者你可以选择 return 一个 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;
}
代码不言自明。
对于初学者来说,声明 std::string
类型的 object 然后尝试将其反转为字符数组是没有意义的。
此外,包含标准 C 函数声明的 header 被命名为 <cstring>
。
您还需要包括包含 class std::string
.
所以 header 应该是
#include <iostream>
#include <string>
#include <cstring>
然而一个问题出现了:为什么不使用类型 std::string
的相同 object 而不是将其解释为字符数组?
你的方法即使编译也有问题。由于这个声明
str = ReverseString(&str[0]);
存在内存泄漏。而且返回的字符串不是 zero-terminated.
因此程序有未定义的行为。
事实上,您要做的是将一个字符串以相反的顺序复制到另一个字符串中。
使用 object 类型的 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] = '[=17=]';
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