C ++: поведение sscanf - PullRequest
       22

C ++: поведение sscanf

1 голос
/ 25 февраля 2011

Может кто-нибудь помочь мне понять этот кусок кода:

    char *line = new char[2048];
    char *probableCauseStr = new char[512];
    char *additioanl_text = new char[512];
    long holdPeriod = 0;

    while( !f.eof() ) {
            f.getline( line, 2048 );
            //
            // find the ',' seperator
            //
            char* p = StrMgt::strchr( line, ',' );
            if( !p ) continue;
            *p = '\0';
            p++;
            if( sscanf( line, "%s%s", probableCauseStr, additioanl_text ) != 1 || 
                sscanf( p, "%ld%s", &holdPeriod, additioanl_text ) != 1 ) continue;

            ....

Я заблудился, пытаясь понять, что происходит с указателем символов p.

Ответы [ 2 ]

2 голосов
/ 25 февраля 2011

p используется для нахождения первой запятой и замены ее на \0 (которая является концом строки для строк в стиле C, в частности для sscanf).Затем p увеличивается, чтобы указывать на следующий символ.

Таким образом, строка типа

"Hello world, 100000"

становится

line -> "Hello world"
p -> " 100000"

Затем два sscanfs пробуются, проверяядля того, кто возвращает 1 (это означает, что он проанализировал ровно 1 значение).В этом примере первый sscanf вернет 2 (так как есть два слова), поэтому будет вызвано второе и вернет 1, при этом holdPeriod получит значение 100000.

2 голосов
/ 25 февраля 2011

Указатель на символ p увеличивается до следующего символа, затем второй sscanf читает данные из ячейки памяти, на которую указывает увеличенный указатель.

Из кода я могу сказать причину, по которой p увеличивается, потому что первоначально первый символ p назначается с \0. Таким образом, он увеличивается до следующего символа, чтобы указывать на целое значение, чтобы sscanf мог прочитать его со спецификатором %ld. После этого sscanf читает строку со спецификатором %s.

...