我想在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");
}
}
}
}
我该如何解决问题? 感谢
答案 0 :(得分:5)
我认为您需要strcpy()
使用s1
cat_url()
,就像这样
strcpy(tmp, s1);
... sizeof()
也用于指针,而不是目标类型char
,还为零终止添加一个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()
。您还可以考虑将整个args
数组移动到of语句的else部分,因为它未在if部分中使用。
答案 1 :(得分: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);
希望它有所帮助!