Реализация альтернативы scanf

.container_12 .grid_6 { ... }

Это правило соответствует узлу DOM с классом container_12 с потомком (не обязательно дочерним) с классом grid_6 и применяет правила CSS к элементу DOM с классом grid_6.

.container_12 > .grid_6 { ... }

Полагая > между ними, говорит, что узел grid_6 должен быть прямым потомком узла с классом container_12.

.container_12, .grid_6 { ... }

Запятая, как и другие заявили, является способом применения правил ко многим различным узлам за один раз. В этом случае правила применяются к любому узлу с классом container_12 или grid_6.

-3
задан Oleg Plachkov 13 July 2018 в 20:29
поделиться

1 ответ

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

Они должны продемонстрировать подход и определенно комната для улучшения.

Предлагаю вам взглянуть на обсуждение вопроса и ответов в atoi vs atol vs strtol vs strtoul vs sscanf

. Функция fgetc() используется для вытягивания одного символа за раз от источника входного сигнала и проверки того, должно ли чтение источника входного сигнала продолжаться или останавливаться. Используя функцию fgetc(), мы можем позволить некоторым другим функциям продолжить чтение из источника входного сигнала, когда используются эти функции scano_l() и scan_d().

Мы также устраняем необходимость в malloc() и сопровождающие free() и управление памятью с использованием локального буфера и возвращения фактического значения в качестве long или double.

Например, простой тест с использованием основного C ++ быть (_tmain(), потому что я использую Microsoft Visual Studio 2005 для создания консольного приложения Windows) ниже. Это можно протестировать с помощью компиляции и затем попробовать несколько разных сценариев ввода данных, в которые вводится целое число, такое как 1234, за которым следуют один или несколько символов пробела (пробел, табуляция, новая строка), а затем число с плавающей запятой, такое как как 45.678, за которым следует, по крайней мере, еще один символ пробела, а затем некоторые текстовые символы.

// scan_no.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

#include <stdlib.h>

extern "C" {
long  scano_l (FILE *pFile);

double  scano_d (FILE *pFile);
};

int _tmain(int argc, _TCHAR* argv[])
{
    // test by reading a few white space delimited numeric value and then a
    // text string just to demonstrate how it works.
    long l = scano_l (stdin);
    double d = scano_d (stdin);
    char testBuffer[256] = {0};

    fgets (testBuffer, 255, stdin);

    printf (" value is %ld\n", l);
    printf (" value is %lf\n", d);
    printf (" value is %s\n", testBuffer);
    return 0;
}

Функции, которые в моем случае находятся в другом исходном файле, csource.c:

#include <stdio.h>
#include <stdlib.h>

// define the states for our Finite State Machine. It be a simple one with
// straight transitions from one state to the next.
enum  StateFSM {StateBegin = 1, StateAccept = 2, StateEnd = 3};

static char *fetchValue (FILE *pFile, char *buffer, int nMaxLen)
{
    int    iBuffIndex = 0;
    enum StateFSM   iState = StateBegin;

    do {
        // until we reach an end state of our state machine or we reach end of file
        // on our input source, lets fetch characters from the input source and decide
        // what to do with the character until our end state is reached.
        // end state is either white space trailing the desired characters or end of file.
        int    iInput = fgetc (pFile);

        if (feof(pFile)) break;
        switch (iInput) {
            case ' ':
            case '\t':
            case '\n':
            case '\r':
                // eat up any leading whitespace
                if (iState != StateAccept) break;
                // we have found trailing white space so we are done.
                iState = StateEnd;
                break;
            default:
                if (iBuffIndex < nMaxLen) {
                    // as long as we are not at the max length lets get a character into
                    // the supplied buffer. if we are at max buffer length then we will
                    // just eat any remaining characters until we come to white space.
                    buffer[iBuffIndex++] = (iInput & 0x7f);
                }
                iState = StateAccept;
                break;
        }
    } while (! (iState == StateEnd));

    return buffer;    // be a good citizen and return the pointer provided to us. allows chaining.
}

long  scano_l (FILE *pFile)
{
    char   buffer[32] = {0};
    long   lValue = 0;
    char   *pTemp;

    lValue = strtol (fetchValue(pFile, buffer, 31), &pTemp, 10);  // max characters is 31 to ensure zero terminator.

    return lValue;
}

double  scano_d (FILE *pFile)
{
    char    buffer[32] = {0};
    double  dValue = 0.0;
    char    *pTemp;

    dValue = strtod (fetchValue(pFile, buffer, 31), &pTemp);  // max characters is 31 to ensure zero terminator.

    return dValue;
}

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

Символы пробела без пробелов (вкладка, новая строка , return) считаются концевыми текстовыми индикаторами. Символ пробела теперь считается допустимым текстовым символом, который добавляется к строке, построенной из ввода. Любое ведущее непространственное пустое пространство отбрасывается, и считается, что текстовая строка начинается с первого символа, который является чем-то иным, чем непространственным символом пробела.

char *  scano_asz(FILE *pFile, char *buffer, int nMaxLen)
{

    int    iBuffIndex = 0;
    enum StateFSM   iState = StateBegin;

    do {
        // until we reach an end state of our state machine or we reach end of file
        // on our input source, lets fetch characters from the input source and decide
        // what to do with the character until our end state is reached.
        // end state is either white space trailing the desired characters or end of file.
        int    iInput = fgetc(pFile);

        if (feof(pFile)) break;
        switch (iInput) {
        case '\t':
        case '\n':
        case '\r':
            // eat up any leading non-space whitespace. spaces embedded in the string are
            // considered part of the string. delimiters include tab, new line, return.
            if (iState != StateAccept) break;
            // we have found trailing non-space white space so we are done.
            iState = StateEnd;
            break;
        default:
            if (iBuffIndex < nMaxLen) {
                // as long as we are not at the max length lets get a character into
                // the supplied buffer. allowable characters include the space character
                // but not other white space characters such as tab, new line, return.
                buffer[iBuffIndex++] = (iInput & 0x7f);
                if (iBuffIndex >= nMaxLen) break;    // once we reach max size then we will break and exit.
            }
            iState = StateAccept;
            break;
        }
    } while (!(iState == StateEnd));

    if (iBuffIndex < nMaxLen) buffer[iBuffIndex] = 0;   // terminate the string if there is roome in the buffer.
    return buffer;
}
0
ответ дан Richard Chambers 17 August 2018 в 12:09
поделиться
Другие вопросы по тегам:

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