程序打破printf()

时间:2015-12-28 15:21:12

标签: c printf embedded-linux

第一个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 个答案:

答案 0 :(得分:5)

read调用可能会错过将空字节附加到rx_buffer,这是%s printf格式化程序所需的。

通过手动添加 1

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

1 感谢@JonathanLeffler!

注意这要求read只读sizeof(rx_buffer) - 1以防止缓冲区溢出,如果read真正读取256个字节,那么{{ 1}}并且写入rx_length == 256是未定义的行为。

注意:

  • rx_buffer[256]返回read。相应地声明ssize_t,因为rx_length可能无法保存适合int的值。