.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
.
Ниже приведен простой пример нескольких функций для возврата числового значения из источника ввода. В этих примерах предполагается, что один или несколько типов символов пробела (пробел, табуляция, конец строки, возврат) используются для разграничения набора числовых полей.
Они должны продемонстрировать подход и определенно комната для улучшения.
Предлагаю вам взглянуть на обсуждение вопроса и ответов в 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;
}