为什么在 char 数组的字符之间插入“\000”字符?
Why are "\000" characters being inserted between characters of a char array?
我正在尝试从 UART 读取传入的数据流,并尝试将收到的每个字符添加到 char
的数组中,直到收到字符 \r
和 \n
(按此顺序)。
我已经编写了一个函数 (char read_uart()
) 来等待 return 接收到单个字符。此函数正确地接收并 returns 单个字符,正如它应该的那样。
在这个函数之上,我尝试创建另一个函数,它应该读取每个字符并将它们添加到数组中,直到收到终止组合。就是这样:
void read_full_uart(char *message[4096])
{
char previousTwo[2] = {'[=10=]', '[=10=]'};
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);
但是,例如传输“比特币”时,message
结果是这样的:
b[=17=]0[=17=]0[=17=]0i[=17=]0[=17=]0[=17=]0t[=17=]0[=17=]0[=17=]0c[=17=]0[=17=]0[=17=]0o[=17=]0[=17=]0[=17=]0i[=17=]0[=17=]0[=17=]0n[=17=]0[=17=]0[=17=]0\r[=17=]0[=17=]0[=17=]0\n[=17=]0[=17=]0[=17=]0
接收到的字符是完整的,但附加了三个 [=18=]0
个字符。
我想知道为什么会发生这种情况,以及如何调整它以便不插入这些额外的字符。
这里有两个问题。
首先,您传递给函数的不是它所期望的。 &message
的类型为 char (*)[4096]
,即指向 char
大小为 4096 的数组的指针。同时,该函数需要一个 char *[4096]
,即 char *
大小为 4096 的数组。这是类型不匹配。
第二个是这一行:
*(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);
我正在尝试从 UART 读取传入的数据流,并尝试将收到的每个字符添加到 char
的数组中,直到收到字符 \r
和 \n
(按此顺序)。
我已经编写了一个函数 (char read_uart()
) 来等待 return 接收到单个字符。此函数正确地接收并 returns 单个字符,正如它应该的那样。
在这个函数之上,我尝试创建另一个函数,它应该读取每个字符并将它们添加到数组中,直到收到终止组合。就是这样:
void read_full_uart(char *message[4096])
{
char previousTwo[2] = {'[=10=]', '[=10=]'};
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);
但是,例如传输“比特币”时,message
结果是这样的:
b[=17=]0[=17=]0[=17=]0i[=17=]0[=17=]0[=17=]0t[=17=]0[=17=]0[=17=]0c[=17=]0[=17=]0[=17=]0o[=17=]0[=17=]0[=17=]0i[=17=]0[=17=]0[=17=]0n[=17=]0[=17=]0[=17=]0\r[=17=]0[=17=]0[=17=]0\n[=17=]0[=17=]0[=17=]0
接收到的字符是完整的,但附加了三个 [=18=]0
个字符。
我想知道为什么会发生这种情况,以及如何调整它以便不插入这些额外的字符。
这里有两个问题。
首先,您传递给函数的不是它所期望的。 &message
的类型为 char (*)[4096]
,即指向 char
大小为 4096 的数组的指针。同时,该函数需要一个 char *[4096]
,即 char *
大小为 4096 的数组。这是类型不匹配。
第二个是这一行:
*(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);