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

Rom*_*dgz 18 c printf buffer

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

printf("%s", buffer);
Run Code Online (Sandbox Code Playgroud)

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

在这里读到,至少在C++中,有可能告诉你想要阅读多少字符%s,但它没有例子,我不知道如何在C中做.任何帮助?

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

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

Sor*_*ren 44

您可以在终止字符后添加空字符,并且printf将起作用,或者您可以'.*'在printf语句中添加一个字符并提供长度

printf("%.*s",len,buf);
Run Code Online (Sandbox Code Playgroud)

在C++中,您可能会使用std :: string和std :: cout,如下所示:

std::cout << std::string(buf,len);
Run Code Online (Sandbox Code Playgroud)

如果你想要的只是最快的速度而没有格式化 - 那就用吧

fwrite(buf,1,len,stdout);
Run Code Online (Sandbox Code Playgroud)


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字符串处理函数进行管理.