打印一个char的缓冲区,在C中传递长度

时间:2011-11-17 16:28:30

标签: c buffer printf

我有一个通过串口接收的缓冲区。当我收到某个特征时,我知道已经到了一个完整的行,我想用printf方法打印它。但是每一行都有不同的长度值,当我选择时:

printf("%s", buffer);

我正在打印该行以及属于前一行的其他字符(如果它长于当前行)。

我读到here,至少在C ++中,可以告诉您在给定%s时要读取多少字符,但它没有示例,我不知道如何在C.做任何帮助?

编辑:完美。所以我有三个解决方案: - 使用带有for循环的char打印char - 使用终止字符 - 或使用。*

问题是:哪一个更快?因为我正在研究微芯片PIC,我希望它尽可能快地发生

4 个答案:

答案 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