Две важные вещи:
1) Всегда проверяйте NULL-терминатор при поиске строки следующим образом:
while (*(attrPtr + position++) != qolon);
должно быть:
while (attrPtr[position] && attrPtr[position++] != qolon);
(если передать строку без искомого символа, это может занять очень много времени, так как она сканирует всю память). Редактировать: Я только что заметил, что кто-то еще опубликовал это раньше, я, ну да ладно. Я не согласен, кстати, strchr () - это хорошо, но простой цикл, который также проверяет терминатор, тоже подойдет (и часто имеет преимущества).
2) ВНИМАНИЕ от strncpy ()!
strncpy(attrValue, attrPtr, position-1);
strlen (attrPtr)> = (position-1), поэтому NOT завершает строку null в attrValue, что может вызвать всевозможные проблемы (включая невероятное замедление в коде позже). Как примечание, strncpy () является уникальным разработчиком, поэтому если вы делаете что-то вроде:
char buf[512];
strncpy(buf,"",4096);
Вы будете писать 4096 байтов нулей.
Лично я использую lstrcpyn () на Win32, и на других платформах у меня есть простая реализация этого. Это гораздо полезнее для меня.