Ты вопрос касается стрелочной разницы расчета, часть семейства арифметических операций, которые выполняются в указателе арифметической.
Большинство новичков не слишком беспокоятся о том, как работает указатель. Учитывая это:
char buffer[256];
char *p = buffer + 10;
это, как правило, ясно, что p
указывает на 10-й слот в buffer
массив символов. Но вы должны помнить, что указатель тип важен. Та же конструкция, вы видите выше, также работает для более сложных типов данных:
struct Something
{
char name[128];
int ident;
int supervisor;
} people[64];
struct Something *p = people+10; // NOTE: same line, different types
Так же, как и раньше, p
указывает на десятый элемент в массиве, но обратите внимание на арифметику; размер базового типа используется для вычисления соответствующего смещения памяти. Вам не нужно делать это самостоятельно. Здесь нет sizeof
.
Так почему вас это волнует? Так как обычная математика, указатель по математике имеет определенные свойства, один из них следующее:
char buffer[256];
char *p = buffer+10; // p addresses the 10th slot in the array
size_t len = p-buffer // len is the typed-difference between p and buffer.
В этом случае len
будет 10, так же, как смещение p
. Итак, как это относится к вашему вопросу? Ну ...
char* temp = strchr(buffer, '/');
memcpy(id, buffer, temp - buffer);
ужасной природы этого кода в стороне (если нет в массиве buffer
результат является temp
быть NULL
не '/'
, и последующий тетсру будет все-но-гарантия массивное выдаёт ошибку сегментации). Этот код находит местоположение в строке, где находится '/'
. Как только это имеет место, в вычислении temp - buffer
используется арифметика указателя (в частности, различие указателей) для вычисления расстояния между адресом в temp
и адресом в качестве базы массива. Результатом является количество элементов , не считая самого коса. Поэтому этот код копирует до, но не включая обнаруженную косую черту, в буфер id
. Остальная часть буфера id
сохраняет все значения 0
, заполненные memset, и поэтому строка прекращается (что намного больше, чем вам нужно, btw).
После этой линии, остальные:
temp++;
strcpy(title, temp);
пост-приращение указателя температуры, который говорит, что «перейти к следующему элементу в массиве». Затем strcpy
копирует оставшиеся символы нулевой строки buffer
в title
.Стоит отметить, это может быть просто:
strcpy(title, ++temp);
и также:
strcpy(title, temp+1);
, который сохраняет temp
на '/'
позиции. Во всем вышеизложенном результат в title
будет таким же: все символы после косая черта, но не включая его.
Надеюсь, это объяснит, что происходит. Удачи.
Я не уверен, что ваше название - это то, что вы намеревались. Вызовы 'memset' в этом коде наиболее прямолинейны:« заполните эту область памяти на этом начальном адресе этим октетом для этого множества повторений ». Я думаю, что «temp-buffer» в вызове ** 'memcpy' ** будет более интересным (и его вычислением * указателя-разницы *, стоит googling). – WhozCraig