在我的C ++程序中,我想将一个数组传递给一个函数,并将该数组的成员打印到控制台。
现在我遇到了两个问题:
int main()
{
unsigned char numbers[8] = { 1,2,3,4,5,6,7,8 };
for (auto i = 0; i < sizeof(numbers); i++)
{
std::cout << numbers[i] << "\n"; // First Problem: Here i get
}
logger(numbers);
}
将numbers
传递到定义为logger
的{{1}}导致类型更改为void logger(unsigned char data[])
,因此由于大小未知,因此无法遍历数组。< / p>
我的目标也是传递任何大小的数组,但是假设数组的大小始终为8,我将签名更改为
unsigned char *
在logger(&numbers)
void logger(unsigned char(*data)[8])
{
for (auto i = 0; i < sizeof(*data); i++)
{
std::cout << *(data[i]) << "\n";
}
}
上迭代是第一个问题,输出为``
所以问题是;
data
上出现一个奇怪的ASCII字符。答案 0 :(得分:6)
问题出在数组的内容中
unsigned char numbers[8] = { 1,2,3,4,5,6,7,8 };
那些被解释为字符代码(由于数组元素类型),而不是文字值。很有可能使用的字符映射是ASCII,并且无法打印字符1到8。
要获取代表1
的字符值,您需要编写字符文字'1'
。如果打算将它们存储为数字,则可以将数组的类型更改为int[8]
,也可以在打印时将其强制转换为
std::cout << static_cast<int>(numbers[i]) << "\n";
另一方面,如果您打算使用字符,则应将类型更改为char
。
要解决传递任意大小的数组的问题,请使用模板并传递对std::array
的引用,或者仅使用vector
。
答案 1 :(得分:3)
您不能将数组传递给C ++中的函数。有几种解决方法
1)使用向量而不是数组
2)将引用传递给数组(仅适用于固定大小的数组)
3)将指针传递到数组的第一个元素(这要求您将大小作为单独的参数传递)。
这三个方法都是这样
1)使用向量
#include <vector>
std::vector<unsigned char>{1,2,3,4,5,6,7,8}:
logger(numbers);
void logger(const vector<unsigned char>& data)
{
for (auto i = 0; i < data.size(); i++)
{
std::cout << (unsigned)data[i] << "\n";
}
}
2)使用参考
unsigned char numbers[8] = { 1,2,3,4,5,6,7,8 };
logger(numbers);
void logger(unsigned char (&data)[8])
{
for (auto i = 0; i < 8; i++)
{
std::cout << (unsigned)data[i] << "\n";
}
}
3)使用指针
unsigned char numbers[8] = { 1,2,3,4,5,6,7,8 };
logger(numbers, 8);
void logger(unsigned char *data, size_t size)
{
for (auto i = 0; i < size; i++)
{
std::cout << (unsigned)data[i] << "\n";
}
}
向量是最好的解决方案。 C ++具有适当的数据结构作为标准,请使用它们。
正如已经解释过的,您的打印问题是由于打印字符的特殊规则所致,在打印之前只能转换为未签名。
没有代码经过测试(甚至编译)。
答案 2 :(得分:2)
尝试使用std :: vector并将字符放在''
内#include <iostream>
#include <vector>
void logger(std::vector<unsigned char>& data)
{
for (size_t i = 0; i < data.size(); ++i)
{
std::cout << data[i] << "\n";
}
}
int main()
{
std::vector<unsigned char> numbers { '1','2','3','4','5','6','7','8' };
for (size_t i = 0; i < numbers.size(); ++i)
{
std::cout << numbers[i] << "\n";
}
logger(numbers);
}
我得到以下输出:
1
2
3
4
5
6
7
8
1
2
3
4
5
6
7
8
答案 3 :(得分:1)
对于第一个问题,请使用:
int arr_size = sizeof(numbers)/sizeof(numbers[0]);