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

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

printf("%s", buffer);

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

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

EDIT: Отлично. Поэтому у меня есть три решения: - печать char на char с помощью цикла for - использование символа завершения - или используя. *

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

Ответы

Ответ 1

Строка, которая у вас есть, не завершена нулем, поэтому 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, которая теперь будет завершаться нулем и поэтому управляема с помощью обычных функций обработки строки C.

Ответ 2

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

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

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

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

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

fwrite(buf,1,len,stdout);

Ответ 3

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

buffer[i] = 0;

Ответ 4

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