gpt4 book ai didi

arrays - 为什么在 char 数组的字符之间插入 "\000"个字符?

转载 作者:行者123 更新时间:2023-12-05 05:59:56 28 4
gpt4 key购买 nike

我正在尝试从 UART 读取传入的数据流,并尝试将接收到的每个字符添加到 char 数组中,直到字符 \r\n 已收到(按此顺序)。

我编写了一个函数 (char read_uart()) 等待接收到单个字符后返回。此函数正确接收并返回单个字符,正如它应该的那样。

在这个函数之上,我尝试创建另一个函数,它应该读取每个字符并将它们添加到数组中,直到接收到终止组合。就是这样:

void read_full_uart(char *message[4096])
{
char previousTwo[2] = {'\0', '\0'};
for (uint16_t i = 0; !(previousTwo[0] == '\r' && previousTwo[1] == '\n'); i++)
{
char currentValue = read_uart();
*(message + i) = currentValue;

previousTwo[0] = previousTwo[1];
previousTwo[1] = currentValue;
}
}

我是这样调用它的:

char message[4096];
read_full_uart(&message);

但是,例如,当传输“比特币”时,消息 结果是这样的:

b\000\000\000i\000\000\000t\000\000\000c\000\000\000o\000\000\000i\000\000\000n\000\000\000\r\000\000\000\n\000\000\000

接收到的字符是完整的,但附加了三个 \000 字符。

我想知道为什么会发生这种情况,以及如何调整它以便不插入这些额外的字符。

最佳答案

这里有两个问题。

首先,您传递给函数的不是它所期望的。 &message 的类型为 char (*)[4096],即指向大小为 4096 的 char 数组的指针。同时,该函数需要一个 char *[4096],即大小为 4096 的 char * 数组。这是类型不匹配。

第二个是在这一行:

*(message + i) = currentValue;

或等效地:

message[i] = currentValue;

您正在将 char 分配给 char * 类型的数组。这也是类型不匹配。

这个问题应该被编译器作为警告发现。如果没有,通过传递选项 -Wall -Wextra(假设 gcc)来提高警告级别并将警告视为错误。

您可以通过更改函数以采用 char 数组来修复这些错误:

void read_full_uart(char message[4096])

或等效地:

void read_full_uart(char *message)

然后将数组直接传递给函数:

read_full_uart(message);

关于arrays - 为什么在 char 数组的字符之间插入 "\000"个字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67890400/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com