Printf буфер char, передающий длину в C

у меня есть буфер, который я получаю через последовательный порт. Когда я получаю определенного карактера, я знаю, что полная строка прибыла, и я хочу напечатать ее с printf метод. Но каждая строка имеет разное значение длины, и когда я просто иду с:

printf("%s", buffer);

я печатаю строку плюс дополнительные символы, принадлежащие предыдущей строке (если она была длиннее текущей).

я прочитала здесь что можно, по крайней мере в C++, сказать, сколько символов вы хотите прочитать данный %s, но у него нет примеров и я не знаю, как это сделать в с.-нибудь помочь?

EDIT: идеально. Итак, у меня есть три решения: - печать char по char с for петли - использование символа завершения - или использовать .*

вопрос: какой из них быстрее? Потому что я работаю над рисунком микрочипа, и я хочу, чтобы это произошло как можно быстрее

4 ответов


строка не null-завершенной, так, printf (и любая другая строковая функция C) не может определить ее длину, поэтому она будет продолжать писать символы, которые она находит там, пока не наткнется на нулевой символ, который там находится.

, чтобы решить вашу проблему вы можете либо:

  • использовать fwrite над stdout:

    fwrite(buffer, buffer_length, 1, stdout);
    

    это работает, потому что fwrite не предназначен для печати только строк, но и любых данных, поэтому он не ищет завершающий нулевой символ, но принимает длину данных, которые будут записаны в качестве параметра;

  • null-завершите буфер вручную перед печатью:

    buffer[buffer_length]=0;
    printf("%s", buffer); /* or, slightly more efficient: fputs(buffer, stdout); */
    

    это может быть лучшей идеей, если вам нужно сделать какой-либо другой обработке строку buffer, теперь это будет null-terminated и поэтому управляемо обычными функциями обработки строк C.


вы можете добавить нулевой символ после символа завершения, и ваш printf будет работать, или вы можете добавить '.*' в вашем заявлении printf и укажите длину

printf("%.*s",len,buf);

В C++ вы, вероятно, будете использовать std:: string и std::cout вместо этого, как это:

std::cout << std::string(buf,len);

если все, что вы хотите, это самая быстрая скорость и без форматирования - тогда используйте

fwrite(buf,1,len,stdout);

вы можете поместить NUL (0x0) в буфер после получения последнего символа.

buffer[i] = 0;


Как только вы определили конец строки, вы должны добавить '' символ до конца буфера перед отправкой его в printf.