C ++,将数组作为字符串返回的函数

Posted

技术标签:

【中文标题】C ++,将数组作为字符串返回的函数【英文标题】:C++, function to return array as string 【发布时间】:2018-04-26 12:49:37 【问题描述】:

我是 C++ 新手,我正在尝试创建一个函数,该函数接受一个数字数组并将这些数字转换为 ASCII 字符,即 int 为字符串。当我尝试输出字符串时,我得到随机字符。我搜索了教程,一个建议是我应该添加一个字符串终止符,我这样做了,但它似乎没有解决它,我找不到可以解决这个问题的答案。

即我希望下面的代码打印“Hello”。

#include <iostream>
#include <string>

char* intToString(int* array, int size)

    char string[size + 1];
    string[size] = '\0';
    for (int i = 0; i <= size; i++)
        string[i] = array[i];

    return string;



int main()

    int my_array[5] = 72, 101, 108, 108, 111;
    int size = 5;
    std::cout << intToString(my_array, size);

    return 0;

【问题讨论】:

你错过了string[i] = itoa(array[i]); 的内容,因为你得到的随机字符不是你想要的数字的字符表示。 您包含#include &lt;string&gt;,但不要使用std::string(C++ 字符串)。 在你的代码中它应该是i&lt;size,因为array[size]是未定义的。 【参考方案1】:

char * 不是字符串。它是指向char 的指针。在您的情况下,您会得到随机字符,因为您返回指向本地 string 的指针,该指针在调用后被销毁。使用std::string,或者,如果你非常想要数组,你可以从std::array获得正确的复制语义。

【讨论】:

我的“字符串终止符”也没有用,所以我删除了它。谢谢 @AndrewCina:不,你需要 &lt;&lt;。不幸的是你实现错了:)【参考方案2】:

你的代码甚至不应该编译,因为 size+1 不是编译时间常数值,改变行

char string[size+1];

char string*=new char[size+1]

应该让你的代码编译并给出正确的输出,因为你在堆上创建了你的数组(所以当函数返回时数组不会被破坏)。然而这意味着你必须自己destroy删除它。

所以改变是个好主意

std::cout << intToString(my_array, size);

char *string=intToString(my_array, size);
std::cout << string;
delete[] string;

虽然请注意其他人的答案是正确的,您应该使用 std::string 和 std::vector 而不是一般的 char 数组和数组,但您现在正在做的是将 c 与 c++ 混合。

【讨论】:

谢谢,是否有更多关于不将 c 与 c++ 混合的信息?我不完全理解混合它们时打破的禁忌。 C++ 的主要设计目标之一是它与 C 的兼容性。这意味着作为开发人员,您必须决定何时使用 C 类型,如普通数组或 C++(更好:STL)类型,如 @ 987654326@。例如,如果您使用 C++ 开发某些微控制器架构,甚至可以禁止使用任何 STL 类型,例如 std::vectorstd::string,因为没有动态堆内存和/或这些类型的性能不符合这些领域的要求非常严格。因此,类型和风格的选择很大程度上取决于您的环境。 我推荐这个question,一般来说没有太大问题,但对于初学者来说,最好掌握C或C++。因为 std::string 与 char[] 不同,所以如果您将一个函数与 char 数组一起使用,而将第二个函数与 std 字符串一起使用,您将度过一段糟糕的时光。稍后当您对 C++ 足够熟悉时,您可能会将 C 与 C++ 混合使用。 谢谢两位——我看了那个问题,它确实很有用,但是,不要跑题太多,我什么时候在 c++ 中真正使用 c?当我尝试编写 STL 可以更轻松地处理的代码时?例如,就我完成的任何关于 c++ 的教程而言,数组似乎是公平的游戏。希望这是有道理的,不是一个坏问题。 @AndrewCina 数组在 c++ 中当然有它们的用途,例如,如果你想要一个棋盘,最好使用数组 int a[8][8] 然后使用向量。我认为你真的不应该那么关注它。【参考方案3】:

尽可能接近您的初始尝试:

#include <iostream>
#include <string>
std::string intToString(int my_array[], int size)

    // just declare a variable of type std::string instead of char string[size+1]
    // there's no need to define a size as this std::string will grow dynamically
    // there's also no need to add a delimiter as std::string takes 
    // care of this itself
    std::string string;
    for (int i = 0; i < size; i++) 
        // this appends an integer representing an (ASCII) codepoint 
        // to an initially empty std::string
        string += my_array[i];
        // this won't work as string is initially empty
        // so you can't access the element at index 0 
        // string[i] = my_array[i];
    
    return string;

int main()

    const int size = 5;
    int my_array[] =  72, 101, 108, 108, 111 ;
    std::cout << intToString(my_array, size) << std::endl;
    return 0;

请注意 cmets 中指出的与您的解决方案的差异。

【讨论】:

虽然从技术上讲,由std::string 管理的缓冲区将由'\0' 终止(因为鉴于op[] 的要求,这是实现它的唯一体面的方法) , 而不是说“[string] 照顾 [the delimiter] 本身”,而是说“string没有分隔符,因为它单独跟踪内容长度”在逻辑上更正确。【参考方案4】:

你写的更新解决方案还是有问题。

您仍应使用size+1 声明string 数组,并且需要将最后一个元素设为\0。 或者您可以使用std::string

这是 C++ 的做法,它可以进一步缩短,但这是尽可能接近您的代码。

#include <iostream>
#include <string>
#include <vector>

std::string intToString(const std::vector<int>& vec)

    std::string ans;
    for (auto& each : vec)
        ans += char(each);
    return ans;



int main()

    std::vector<int> vec72, 101, 108, 108, 111;
    std::cout << intToString(vec);
    return 0;

【讨论】:

一些新的语言供我探索 - 谢谢。所以我正确理解我的代码(未缩短)将通过用 std::string 而不是 char 声明字符串来纠正?这是有原因的吗? 仅仅声明string 类型为std::string 是不够的。看我的回答。 正如我所提到的,您可以使用char[size+1],但它在您的情况下是偶然的。【参考方案5】:

在 C++11 中,std::to_string 更可取。如果您需要针对多个类型和/或数据容器的转换器功能,您可以使用这样的模板功能

#include <iostream>
#include <string>
#include <vector>
#include <array>

template <typename T>
std::string toString(const T & items) 
    std::string str;
    for (const auto & item : items) 
        str += std::to_string(item);
    

    return str;



int main() 
    const std::vector<int> my_vector 102, 101, 108, 108, 111;
    std::cout << toString(my_vector);


    std::cout << std::endl;

    const std::array<double,5> my_array 102, 101, 108, 108.5, 111.0;
    std::cout << toString(my_array);
    return 0;

【讨论】:

问题的作者指定他想将整数转换为相应的 ascii 字符而不是它们的字符串表示形式。

以上是关于C ++,将数组作为字符串返回的函数的主要内容,如果未能解决你的问题,请参考以下文章

C语言试题五十五之m个人的成绩存放在score数组中,请编写函数function,它的功能是:将高于平均分的人数作为函数值返回,将高于平均分的分数放在high所指定的数组中。

C语言试题五十五之m个人的成绩存放在score数组中,请编写函数function,它的功能是:将高于平均分的人数作为函数值返回,将高于平均分的分数放在high所指定的数组中。

c语言中怎么用二维数组作为函数参数

请用c语言编写一个函数fun功能是:计算n门课程的平均分,计算结果作为函数值返回

C语言试题十二之m个人的成绩存放在score数组中,请编写函数fun,它的功能是:将低于平均分的人作为函数值返回,将低于平均分的分数放在below所指定的函数中。

C语言中,数组名作为函数参数,属于啥传递,为啥?