int x;
printf("hello %n World\n", &x);
printf("%d\n", x);
Существуют ли какие-либо практические приложения для формата% n в семействе printf/scanf?
Ответ 1
Это не так полезно для printf()
, но может быть очень полезно для sscanf()
, особенно если вы разбираете строку в нескольких итерациях. fscanf()
и scanf()
автоматически увеличивают свои внутренние указатели на количество вводимых данных, но sscanf()
нет. Например:
char stringToParse[256];
...
char *curPosInString = stringToParse; // start parsing at the beginning
int bytesRead;
while(needsParsing())
{
sscanf(curPosInString, "(format string)%n", ..., &bytesRead); // check the return value here
curPosInString += bytesRead; // Advance read pointer
...
}
Ответ 2
Его можно использовать для выполнения злых дел.
Ответ 3
Зависит от того, что вы подразумеваете под практикой. Всегда есть другие способы его выполнения (печатайте в строковый буфер с помощью s [n] printf и, например, вычисляйте длину).
Однако
int len;
char *thing = "label of unknown length";
char *value = "value value value"
char *value2="second line of value";
printf ("%s other stuff: %n", thing, &len);
printf ("%s\n%*s, value, len, value2);
должен производить
label of unknown length other stuff: value value value
second line of value
(хотя непроверенный, я не рядом с компилятором C)
Это практически практично как способ согласования вещей, но я бы не хотел видеть его в коде. Есть лучшие способы сделать это.
Ответ 4
Это довольно эзотерическое. Если вам нужно заменить местозаполнитель в сгенерированной строке позже, вы можете захотеть запомнить индекс в середине строки, так что вам не нужно либо сохранять исходный параметр printf, либо анализировать строку.
Ответ 5
Его можно было бы использовать как быстрый способ получить длины различных подстрок.
Ответ 6
#include <stdio.h>
int main(int argc, char* argv[])
{
int col10 = (10 - 1);
int col25 = (25 - 1);
int pos1 = 0;
int pos2 = 0;
printf(" 5 10 15 20 25 30\n");
printf("%s%n%*s%n%*s\n", "fried",
&pos1, col10 - pos1, "green",
&pos2, col25 - pos2, "tomatos");
printf(" ^ ^ ^ ^ ^ ^\n");
printf("%d %d\n", pos1, pos2);
printf("%d %d\n", col10 - pos1, col25 - pos2);
return 0;
}
Я точно что-то упустил. Томатос слишком далеко вправо.
Ответ 7
Здесь что-то из кода CRT VS2005:
/* if %n is disabled, we skip an arg and print 'n' */
if ( !_get_printf_count_output() )
{
_VALIDATE_RETURN(("'n' format specifier disabled", 0), EINVAL, -1);
break;
}
который вызывает это:
alt text http://www.shiny.co.il/shooshx/printfn.png
для следующей строки:
printf ("%s other stuff: %n", thing, &len);
Я предполагаю, что это в основном для того, чтобы избежать того, что @eJames говорит о
Ответ 8
вы можете позвонить
int _get_printf_count_output();
чтобы увидеть, поддерживает ли поддержка% n, или используйте
int _set_printf_count_output( int enable );
Чтобы включить или отключить поддержку формата% n.
из MSDN VS2008