首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么MySQL会破坏wget_iri_relative_to_abs?

问为什么MySQL会破坏wget_iri_relative_to_abs?
EN

Stack Overflow用户
提问于 2020-06-03 08:54:05
回答 1查看 34关注 0票数 0

考虑下面的复制器:

代码语言:javascript
复制
#include <wget.h>
#include <string.h>
#include <mysql.h>

MYSQL *mysql_con;

void
mysql_stop()
{
        mysql_close(mysql_con);
}

void
mysql_start()
{
        mysql_con = mysql_init(NULL);
        if (mysql_con == NULL)
        {
                fprintf(stderr, "%s\n", mysql_error(mysql_con));
                exit(1);
        }
        if (mysql_real_connect(mysql_con, "localhost", "crawler", "password", "crawl", 0, NULL, 0) == NULL)
        {
                fprintf(stderr, "%s\n", mysql_error(mysql_con));
                exit(EXIT_FAILURE);
        }
}

const char * parseURI (char *base_url, char *url)
{
    wget_iri *base = wget_iri_parse(base_url, NULL);
    wget_buffer *buf = wget_buffer_alloc(8192);
    const char *uri = wget_iri_relative_to_abs(base, url, strlen(url), buf);
    wget_buffer_free(&buf);
    wget_iri_free(&base);
    return uri;
}

void crawler_init()
{
    const char *url2 = parseURI("http://www.google.com/", "/intl/en/policies/privacy/");
    printf("%s\n", url2);
}

int main (int argc, char **argv)
{
    const char *url2 = parseURI("http://www.google.com/", "/intl/en/policies/privacy/");
    printf("%s\n", url2);
    mysql_start();
    crawler_init();
    mysql_stop();
}

运行此程序的输出为:

代码语言:javascript
复制
http://www.google.com/intl/en/policies/privacy/
��7�

main中的第一个printf如预期的那样打印出绝对url。crawler_init中的第二个printf输出的是垃圾,而不是相同的绝对url。

这似乎与mysql_real_connect有关,因为当此调用被注释掉时,crawler_init中的第二个printf会打印出预期的绝对url。

为什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-05 18:02:32

添加buf->data = NULL;可以解决此问题:

代码语言:javascript
复制
#include <wget.h>
#include <string.h>
#include <mysql.h>

MYSQL *mysql_con;

void
mysql_stop()
{
        mysql_close(mysql_con);
}

void
mysql_start()
{
        mysql_con = mysql_init(NULL);
        if (mysql_con == NULL)
        {
                fprintf(stderr, "%s\n", mysql_error(mysql_con));
                exit(1);
        }
        if (mysql_real_connect(mysql_con, "localhost", "crawler", "1q2w3e4r", "crawl", 0, NULL, 0) == NULL)
        {
                fprintf(stderr, "%s\n", mysql_error(mysql_con));
                exit(EXIT_FAILURE);
        }
}

const char * parseURI (char *base_url, char *url)
{
    wget_iri *base = wget_iri_parse(base_url, NULL);
    wget_buffer *buf = wget_buffer_alloc(8192);
    const char *uri = wget_iri_relative_to_abs(base, url, strlen(url), buf);
    buf->data = NULL;
    wget_buffer_free(&buf);
    wget_iri_free(&base);
    return uri;
}

void crawler_init()
{
    const char *url2 = parseURI("http://www.google.com/", "/intl/en/policies/privacy/");
    printf("%s\n", url2);
}

int main (int argc, char **argv)
{
    const char *url2 = parseURI("http://www.google.com/", "/intl/en/policies/privacy/");
    printf("%s\n", url2);
    mysql_start();
    crawler_init();
    mysql_stop();
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62163576

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档