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 <string>
,但不要使用std::string
(C++ 字符串)。
在你的代码中它应该是i<size
,因为array[size]
是未定义的。
【参考方案1】:
char *
不是字符串。它是指向char
的指针。在您的情况下,您会得到随机字符,因为您返回指向本地 string
的指针,该指针在调用后被销毁。使用std::string
,或者,如果你非常想要数组,你可以从std::array
获得正确的复制语义。
【讨论】:
我的“字符串终止符”也没有用,所以我删除了它。谢谢 @AndrewCina:不,你需要<<
。不幸的是你实现错了:)【参考方案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::vector
或 std::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语言编写一个函数fun功能是:计算n门课程的平均分,计算结果作为函数值返回
C语言试题十二之m个人的成绩存放在score数组中,请编写函数fun,它的功能是:将低于平均分的人作为函数值返回,将低于平均分的分数放在below所指定的函数中。