w中的无效编码

Gan*_*alf 2 c wget

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

页面名称是这样的

test0L???i}?X?????L???????R?td]?{??+`??U{?@ (invalid encoding)
Run Code Online (Sandbox Code Playgroud)

我的计划的重要部分是这个.

#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");
            }
       }
    }
}
Run Code Online (Sandbox Code Playgroud)

我怎么能解决这个问题呢?谢谢

epa*_*tel 5

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

strcpy(tmp, s1);
Run Code Online (Sandbox Code Playgroud)

...也是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;
}
Run Code Online (Sandbox Code Playgroud)

Wizzard的回答也很重要,itoa()并且结果的使用也很重要.

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