当前位置:  开发笔记 > 编程语言 > 正文

程序打破printf()

如何解决《程序打破printf()》经验,为你挑选了1个好方法。

在第一个printf()程序打破之后,甚至没有到达下一个程序printf().

void UART_rx(void) {
    char rx_buffer[256];
    int rx_length = read(uart_filestream, (void*) rx_buffer, sizeof(rx_buffer));

    if(rx_length > 0) {
        printf("%s", rx_buffer);
        printf(" ok");
        rx_buffer[12] = '\0';
        printf(" ok");
        char str_id[4];
        char *start;
        start = strchr(rx_buffer, ',');
        start++;
        strcpy(str_id,start);
        int id;
        id = atoi(str_id);
        printf("Liczba typu int: %d, oraz jako ciag znakow: %s\n", id, str_id);
    }
}

问题出在哪里?



1> cadaniluk..:

read呼叫可能会缺少追加空字节rx_buffer,这是由需要%s的格式printf.

通过手动添加它来做到这一点1:

printf("%*.*s\n", rx_length, rx_length, rx_buffer);

1感谢@JonathanLeffler!

请注意,这需要read只读sizeof(rx_buffer) - 1以防止缓冲区溢出,如果read真正读取256字节,因为那时rx_length == 256写入rx_buffer[256]是未定义的行为.


笔记:

read返回一个ssize_t.相应地声明rx_length,因为int可能无法保存ssize_t非常合适的值.


或者,更好(因为它不需要改变缓冲区的长度),使用原始的`read()`但是`printf("%*.*s \n",rx_length,rx_length,buffer);打印缓冲区加上一个尾随换行符,限制为`read()`调用返回的长度.
推荐阅读
pan2502851807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有