FER*_*RBI 1 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);
}
}
Run Code Online (Sandbox Code Playgroud)
问题出在哪里?
该read呼叫可能会缺少追加空字节rx_buffer,这是由需要%s的格式printf.
通过手动添加它来做到这一点1:
printf("%*.*s\n", rx_length, rx_length, rx_buffer);
Run Code Online (Sandbox Code Playgroud)
1感谢@JonathanLeffler!
请注意,这需要read只读sizeof(rx_buffer) - 1以防止缓冲区溢出,如果read真正读取256字节,因为那时rx_length == 256写入rx_buffer[256]是未定义的行为.
笔记:
read返回一个ssize_t.相应地声明rx_length,因为int可能无法保存ssize_t非常合适的值.| 归档时间: |
|
| 查看次数: |
138 次 |
| 最近记录: |