第一个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);
}
}
问题出在哪里?
答案 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
的值。