我已编辑过上一个问题。
由于我遇到了问题并且更改了代码,现在我遇到了另一个问题。如果我使用execle命令,它只使用wget命令下载一个图像,否则如果wget命令没有执行,它会在屏幕上打印所有图像名称。我不明白什么时候有一个while循环,那为什么它只打印一个图像。
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<limits.h>
#include<fcntl.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<stdio.h>
void main(int argc, char*argv[])
{
int iFlag;
char cline[100];
FILE*fil = fopen("index.html","rt");
if(fil==NULL)
{
printf("Error in opening file");
}
char*tmpLine;
char*tok;
const char check[10] = "<img";
const char check2[10] = "src=";
char images[50];
strcpy(images,argv[1]);
while(fgets(cline,100,fil)!=NULL)
{
if(strstr(cline,check)!=NULL)
{
tmpLine=strstr(cline,check);
if(strstr(cline,check2)!=NULL)
{
tmpLine=strstr(cline,check2);
tok = strtok(tmpLine,"\"");
while(tok!=NULL)
{
tok = strtok(NULL,"\"");
if(tok[0]!='/')
{
strcat(images,"/");
strcat(images,tok);
printf("\nimage: %s\n",images);
iFlag = execle("/usr/bin/wget","wget","-o","logfile",images,NULL);
if(iFlag<0)
perror("EXECLE ERROR");
break;
}
else
break;
}
memset(&images[0], 50, sizeof(images));
strcpy(images,argv[1]);
}
}
}
}
答案 0 :(得分:8)
fil
可能为NULL。为什么呢?
FILE*fil = fopen("index.hmtl","rt");
因为你输入了文件名。这就是检查错误的好主意。
答案 1 :(得分:4)
这一行
printf("%s\n",tok[0]);
没有意义,因为您传递了char
,char *
是预期的。
要么
printf("%s\n", tok);
或
printf("%c\n", tok[0]);
也是这一行
char*images = (char*)malloc(100);
创建内存泄漏,因为在没有images
的情况下声明上下文images
时,对分配给free()
的内存的引用会丢失。
另外^ 2:
In C there is no need to cast the result of malloc/calloc/realloc
, nor is it recommended.
所以上面这行应该更好:
char * images = malloc(100);
另外^ 3:总是检查系统调用的结果,至少如果代码依赖于返回的值。这里:检查fopen()
是否失败,因为返回错误NULL
,如果用作有效的文件指针,将使程序阻塞。
作为如何查找错误的一般建议:使用符号编译相关代码(gcc选项-g
),然后使用调试器作为gcc逐步执行“运行”代码。
答案 2 :(得分:1)
您应该检查fopen()
的返回值,正如其他人已经指出的那样。
printf("%s\n",tok[0]);
应为printf("%s\n",tok);
。
更严重,
while(tok!=NULL)
{
strcat(images,tok);
}
tok = strtok(NULL,quote);
此tok = strtok(...);
应放在while
循环中,否则tok
将永远不会更改,并且您的程序最终会崩溃。