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

Posted

技术标签:

【中文标题】返回一个指向 char 数组的指针。如何打印出数组的全部内容?【英文标题】:returning a pointer that points to char array. How do i print out the entire contents of the array? 【发布时间】:2017-11-16 21:51:29 【问题描述】:

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

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

我似乎不知道如何返回整个缓冲区而不是指针指向的一个元素。

【问题讨论】:

char *ReverseString(char* input)return revBuffer;或者 - 更好 - 返回std::string 你泄露了char[] 不要使用 char 数组,在任何地方使用 std::strings。 【参考方案1】:

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

此外,包含标准 C 函数声明的标头命名为 &lt;cstring&gt;

您还需要包含包含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

【讨论】:

非常感谢,您的解释很容易理解。【参考方案2】:

您返回的是 char 而不是 char*。 char 始终只是一个字符。如果要返回字符串,请返回字符串或 char*。

【讨论】:

【参考方案3】:

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

【讨论】:

谢谢你有没有不使用 std::string 的方法?【参考方案4】:

你可以做两件事。您可以选择返回一个 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* 的方法。现在程序打印了反转的字符串,但它也打印了一些随机字符。 这里有一些输出。请输入字符串:hi 您输入的字符串是:hi ih.▒【参考方案5】:

您的函数设置为返回单个字符 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 = '\0';
    //return a pointer to the reversed string
    return revBuffer;

【讨论】:

嘿,所以我修复了我的函数以返回一个 char*,但是现在当我打印到控制台时,我得到了带有一些其他随机字符的反转字符串。会不会是我的指针算术?我看不出有什么问题。非常感谢。 发生这种情况是因为您没有在反转字符串的末尾添加 NULL 终止字符 \0 @monkhii NULL 终止字符添加,再次检查代码。

以上是关于返回一个指向 char 数组的指针。如何打印出数组的全部内容?的主要内容,如果未能解决你的问题,请参考以下文章

通过指向数组的指针返回结果

如何正确传递带有指向函数的指针的数组?

C语言打印输出指针数组

Arduino指向结构变量的指针和指向结构数组的指针打印输出

将 char 指针数组传递给函数

如何在C中对指向char的指针数组进行qsort?