Попробуйте это (я предполагаю, что ошибка во время выполнения из-за пустого / недействительного указателя):
for (...; it != str.end(); ++it)
...
if (!it->empty())
{
strcat(query, it->c_str());
}
РЕДАКТИРОВАТЬ: Извините, c_str () никогда не возвращает NULL, который я временно забыл, так что это всегда безопасно. Если, конечно, буфер запроса не является достаточно длинным, чтобы иметь возможность содержать все соединенные строки, конечно (или есть какая-то другая проблема, например, итератор за пределами .end (), контейнер, измененный во время цикла, или что-то подобное).