在第一个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); } }
问题出在哪里?
该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
非常合适的值.