2

我想用c下载一个带有wget的网页。我已经编写了这段代码,但是当我尝试它时,程序下载了仅以给定名称的一部分命名的页面,并且我在文件名中发现了无效的编码。

页面名称是这样的

test0L���i}�X�����L�������R�td]�{��+`��U{�@ (invalid encoding)

我的程序的重要部分是这个。

#define PAGE "http://deckbox.org/games/mtg/cards?p="

char *cat_url(char *s1, char *s2)
{
    char *tmp;
    tmp = (char*)malloc(sizeof(char*) * (strlen(s1) + strlen(s2)));
    strcat(tmp, s1);
    strcat(tmp, s2);
    return tmp;
}

void get_card_name(char *pg_name)
{
    int i;
    int fk;
    char *args[6], tmp;

    for (i = 0; i < 8; i++) {
        tmp = itoa(i);
        args[0] = "wget";
        args[1] = "-q";
        args[2] = cat_url(PAGE, &tmp);
        args[3] = "-O";
        args[4] = cat_url("test", &tmp);
        args[5] = NULL;

        if (fork()) {
            wait(&fk);
        } else {
            if (execvp(args[0], args) == -1) {
               error_rep("ERROR.\n");
            }
       }
    }
}

我该如何解决这个问题?谢谢

4

2 回答 2

5

我认为你需要使用strcpy()in s1cat_url()像这样

strcpy(tmp, s1);

...也是sizeof()指针而不是目标类型char加上一个字符作为零终止符。也许是这样的

char *cat_url(char *s1, char *s2)
{
    char *tmp;
    tmp = (char*)malloc(sizeof(char)*(strlen(s1) + strlen(s2) + 1)); // sizeof char and not pointer
    strcpy(tmp, s1); // strcpy here
    strcat(tmp, s2);
    return tmp;
}

Wizzard 的答案也有一个关于其结果的重要观点itoa()和用法。

...最后一点,在使用它们之后存在内存泄漏,args[2]并且argc[4]应该是free()'d 。您还可以考虑将整个args数组移动到 of 语句的 else 部分,因为它没有在 if 部分中使用。

于 2013-04-12T21:09:13.353 回答
2

问题在于以下几行:

char tmp;
tmp = itoa(i);

请尝试以下方法:

char tmp[2];   // to store 1 char and '\0'
...
snprintf (tmp, sizeof (tmp), "%d", i);   // portable way to convert int to string
...
args[2] = cat_url(PAGE, tmp); // tmp is a pointer now
...
args[4] = cat_url("test", tmp);

希望能帮助到你 !

于 2013-04-12T21:13:23.600 回答