我有一个通过串口接收的缓冲区。当我收到某个特征时,我知道已经到了一个完整的行,我想用printf
方法打印它。但是每一行都有不同的长度值,当我选择时:
printf("%s", buffer);
我正在打印该行以及属于前一行的其他字符(如果它长于当前行)。
我读到here,至少在C ++中,可以告诉您在给定%s
时要读取多少字符,但它没有示例,我不知道如何在C.做任何帮助?
for
循环的char打印char
- 使用终止字符
- 或使用。*
问题是:哪一个更快?因为我正在研究微芯片PIC,我希望它尽可能快地发生
答案 0 :(得分:42)
您可以在终止字符后添加空字符,并且printf可以正常工作,或者您可以在printf语句中添加'.*'
并提供长度
printf("%.*s",len,buf);
在C ++中,您可能会使用std :: string和std :: cout,如下所示:
std::cout << std::string(buf,len);
如果您想要的只是最快的速度而没有格式化 - 那么请使用
fwrite(buf,1,len,stdout);
答案 1 :(得分:27)
你拥有的字符串不是以空值终止的,因此,printf
(以及任何其他C字符串函数)无法确定其长度,因此它将继续写入它在那里找到的字符,直到它偶然发现null恰好在那里的角色。
要解决您的问题,您可以:
使用fwrite
而不是stdout
:
fwrite(buffer, buffer_length, 1, stdout);
这是有效的,因为fwrite
不打算只打印字符串,而是打印任何类型的数据,因此它不会查找终止空字符,而是接受要作为参数写入的数据长度
在打印前手动终止缓冲区:
buffer[buffer_length]=0;
printf("%s", buffer); /* or, slightly more efficient: fputs(buffer, stdout); */
如果你必须在buffer
上进行任何其他字符串处理,这可能是一个更好的主意,现在它将被空终止,并且可以通过普通的C字符串处理函数进行管理。
答案 2 :(得分:3)
收到最后一个字符后,可以在缓冲区中放入NUL(0x0)。
buffer[i] = 0;
答案 3 :(得分:2)
确定行尾后,必须先将'\0'
字符附加到缓冲区的末尾,然后再将其发送到printf
。