我正在开发一个C++库,该库使用curl执行API请求。我遇到了一个问题,我试图使用curl_slist
和curl_easy_getinfo(curl, CURLINFO_COOKIELIST, &cookies);
处理响应中返回的cookie。
它看起来像是一个链表,所以我有一个当前和下一个属性,我正在检查下一个为NULL时,我应该跳出循环,但由于某种原因,它被困在循环中,看起来像是一遍又一遍地做同样的cookie,但不知道为什么。
struct curl_slist* cookies;
curl_easy_getinfo(curl, CURLINFO_COOKIELIST, &cookies);
int i = 1;
std::vector<CookieObj> cookieObjects;
struct curl_slist* current = cookies;
if (current != NULL)
{
string cookieString = string(current->data);
CookieObj cookieObj = storeCookie(cookieString);
cookieObjects.push_back(cookieObj);
while (current->next != NULL)
{
string cookieString = string(current->data);
CookieObj cookieObj = this->storeCookie(cookieString);
cookieObjects.push_back(cookieObj);
current = cookies->next;
i++;
}
问题出在这条线上
current = cookies->next
cookies
总是指向同一个事物,所以cookies->next
总是指向相同的事物。所以,是的,循环将无限期地继续(假设列表中至少有2个cookie(。你想要的是:
current = current->next;
代码简化
您当前的代码还会处理第一个cookie两次,因为current直到最后才更新。一种可能的代码重排:
for (current=cookies; current; current=current->next) {
/* process cookie */
}