我是C ++的新手,我正在尝试创建一个带有数字数组的函数,并将这些数字转换为ASCII字符,即int到string。当我尝试输出字符串但是我得到随机字符。我已经搜索了教程,并建议我应该添加一个字符串终结符,我做了,但它似乎没有解决它,我找不到可以解决这个问题的答案。
即。我想要下面的代码打印" 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;
}
答案 0 :(得分:1)
--platform
不是字符串。它是char *
的指针。在您的情况下,您会得到随机字符,因为您返回指向调用后销毁的本地char
的指针。使用string
或者,如果您希望数组那么多,您可以从std::string
获得正确的复制语义。
答案 1 :(得分:1)
您的代码甚至不应该编译,因为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 ++混合。
答案 2 :(得分:0)
您编写的已更新解决方案中仍存在问题。
string
声明size+1
数组,并且需要将最后一个元素设为\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> vec{72, 101, 108, 108, 111};
std::cout << intToString(vec);
return 0;
}
答案 3 :(得分:0)
尽可能接近您的初步尝试:
timeout
请注意评论中指出的与您的解决方案的区别。
答案 4 :(得分:0)
在C ++ 11中std::to_string
更可取。如果您需要多种类型的转换器功能和/或datacontainer,您可以使用这样的模板功能
#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;
}