微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么在 char 数组的字符之间插入“\000”字符?

如何解决为什么在 char 数组的字符之间插入“\000”字符?

我正在尝试从 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);

但是,例如传输“比特币”时,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],即指向 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);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。