2013-06-13 4 views
0

Перемещение код из Sprintf в snprintf - споткнулся accross это странное:Sprintf каскадные аргументы: Sprintf (а + б "")

встречаемости
sprintf(buf+strlen(buf), "ypasZ%c%c", iItem, val); 

Я не понимая, что происходит там: http://www.cplusplus.com/reference/cstdio/sprintf/ не помогает. Является ли первый аргумент (запись на место) «увеличенным» по его размеру? => означает ли это, что записываемое место не buf, а buf увеличивается по размеру? Или он предварительно устанавливает положение блока записи в позицию существующей строки в buf, чтобы ПРИЛОЖИТЬ текст?

+1

Вы добавили эти символы '**'? Я их вынул, так как они (предположительно) не являются частью кода. –

+0

Рассмотрите 'strcpy (buf + strlen (buf)," foo ");' это приложение плохого человека ... Может быть удобно, если вы создаете несколько операторов печати. –

ответ

3

Да, он прилагается. Первым аргументом sprintf является адрес (указатель), где он будет записывать результат.

Если buf является массивом символов, компилятор (в подобных случаях) будет рассматривать его как указатель. И добавление к нему увеличит адрес. Добавив длину, что будет, будет указывать на текущий конец строки.

По сути, первый параметр говорит address of string plus length of string that is there, указывая адрес конца строки, а не начало, поэтому команда sprintf будет записывать свой результат в конец текущей строки.

+0

должен иметь правильный порт для sprintf(), а затем «SnPrintf (buf + strlen (buf)», ** DEF_BUF_SIZE-1 **, «YpasZ% c% c», iItem, val); или «SnPrintf (buf + strlen (buf)», ** DEF_BUF_SIZE-1 - strlen (buf) **, «YpasZ% c% c», iItem, val); или что-то другое? –

+0

@PierreJohnson - 'DEF_BUF_SIZE-1' не будет делать. Вам нужно взять размер буфера, минус ('(buf + strlen (buf)) - p'), где' p' - начало распределения (может быть таким же, как 'buf', но это не ясно из вашего пример.) – asveikau

+0

Pierre: да, правильный порт для snprintf должен будет вычесть strlen() из размера буфера, как вы указали. – Yamodax

1

Или он предварительно устанавливает положение блока записи в позицию существующей строки в buf, чтобы ПРИЛОЖИТЬ текст?

Да, это то, что он делает.

1

Первый аргумент - это указатель на область, где sprintf должен написать форматированную строку. buf + strlen(buf) означает адрес конечного символа NULL ('\0'). sprintf просто записывает в память, начиная с этого символа NULL, тем самым продолжая строку в buf.

0

Это означает, что buf, вероятно, определяется как массив размером n, char buf[n]. Использование strlen(buf) необходимо, потому что оно вернет указатель в конец строки в buf, добавив к нему.