我有一个缓冲区,我通过串口接收.当我收到某个特征时,我知道已经到了一个完整的行,我想用printf方法打印它.但是每一行都有不同的长度值,当我刚开始时:
printf("%s", buffer);
Run Code Online (Sandbox Code Playgroud)
我正在打印该行以及属于前一行的其他字符(如果它比当前行长).
我在这里读到,至少在C++中,有可能告诉你想要阅读多少字符%s,但它没有例子,我不知道如何在C中做.任何帮助?
编辑:完美.所以我有三个解决方案: - for使用循环字符 - 使用终止字符 - 或使用.*打印字符串char .
问题是:哪一个更快?因为我正在研究微芯片PIC,我希望它尽可能快地发生
Sor*_*ren 44
您可以在终止字符后添加空字符,并且printf将起作用,或者您可以'.*'在printf语句中添加一个字符并提供长度
Run Code Online (Sandbox Code Playgroud)printf("%.*s",len,buf);
在C++中,您可能会使用std :: string和std :: cout,如下所示:
Run Code Online (Sandbox Code Playgroud)std::cout << std::string(buf,len);
如果你想要的只是最快的速度而没有格式化 - 那就用吧
Run Code Online (Sandbox Code Playgroud)fwrite(buf,1,len,stdout);
Mat*_*lia 28
您拥有的字符串不是以空值终止的,因此,printf(和任何其他C字符串函数)无法确定其长度,因此它将继续写入它在那里找到的字符,直到它偶然发现碰巧存在的空字符.
要解决您的问题,您可以:
使用fwrite结束stdout:
fwrite(buffer, buffer_length, 1, stdout);
Run Code Online (Sandbox Code Playgroud)
这是有效的,因为fwrite不打算只打印字符串,而是打印任何类型的数据,因此它不会查找终止空字符,而是接受要作为参数写入的数据的长度;
在打印前手动终止缓冲区:
buffer[buffer_length]=0;
printf("%s", buffer); /* or, slightly more efficient: fputs(buffer, stdout); */
Run Code Online (Sandbox Code Playgroud)
如果你必须进行任何其他字符串处理buffer,这可能是一个更好的主意,现在将由null终止,并且可以通过普通的C字符串处理函数进行管理.
| 归档时间: |
|
| 查看次数: |
54131 次 |
| 最近记录: |