Есть ли какое-либо практическое применение для формата %n в printf/scanf семье?

Есть два способа, поместив его внутри componentDidMount, вы можете решить проблему:

1. Привяжите эту область к функции

.bind (this)

twitter.get('statuses/user_timeline', function(error, data) {
   this.setState({tweets: data})
}).bind(this);

2. Используйте стрелку жира

=>

twitter.get('statuses/user_timeline', (error, data) => {
   this.setState({tweets: data})
});
17
задан EvilTeach 10 December 2008 в 01:36
поделиться

8 ответов

Это не настолько полезно для 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
    ...
}
15
ответ дан 30 November 2019 в 12:44
поделиться

Это может использоваться для выполнения злые дела .

5
ответ дан 30 November 2019 в 12:44
поделиться

Зависит, под чем Вы подразумеваете практичный. Всегда существуют другие способы выполнить его (печать в строковый буфер с 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
ответ дан 30 November 2019 в 12:44
поделиться

Это довольно тайно. Если необходимо заменить заполнителя в сгенерированной строке позже, Вы могли бы хотеть помнить индекс в середину строки, так, чтобы Вы или не сохраняли исходный printf параметр или проанализировать строку.

3
ответ дан 30 November 2019 в 12:44
поделиться

Это могло возможно использоваться в качестве быстрого способа получить длины различных подстрок.

1
ответ дан 30 November 2019 в 12:44
поделиться
#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;
}

я пропускаю что-то здесь наверняка. Tomatos слишком далек направо.

1
ответ дан 30 November 2019 в 12:44
поделиться

Вот что-то от кода VS2005 CRT:

/* 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;
}

, который поднимает это:

сопроводительный текст http://www.shiny.co.il/shooshx/printfn.png

для следующей строки:

    printf ("%s other stuff: %n", thing, &len);

я предполагаю, что это должно главным образом избежать того, какой @eJames говорит [приблизительно 117]

0
ответ дан 30 November 2019 в 12:44
поделиться

вы можете позвонить по

int _get_printf_count_output();

, чтобы узнать, включена ли поддержка% n, или использовать

int _set_printf_count_output( int enable );

, чтобы включить или отключить поддержку формата% n.

из MSDN VS2008

0
ответ дан 30 November 2019 в 12:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: