Printf буфер char, передающий длину в C - PullRequest
16 голосов
/ 17 ноября 2011

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

printf("%s", buffer);

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

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

РЕДАКТИРОВАТЬ: Отлично. Итак, у меня есть три решения: - печать символа на символе с петлей for - используя символ завершения - или используя. *

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

Ответы [ 4 ]

42 голосов
/ 17 ноября 2011

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

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

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

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

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

fwrite(buf,1,len,stdout);
27 голосов
/ 17 ноября 2011

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

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

  • использовать 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.

3 голосов
/ 17 ноября 2011

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

buffer[i] = 0;

2 голосов
/ 17 ноября 2011

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

...