C - 循环中的 execl 和 wget 命令



我已经编辑了我之前的问题。

由于我遇到了问题并更改了代码,现在我遇到了不同的问题。如果我使用 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: %sn",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]);
        }
    }
}

}

fil 可能是 NULL。为什么?

FILE*fil = fopen("index.hmtl","rt");

因为您输入了文件名。这就是为什么检查错误是个好主意的原因。

此行

        printf("%sn",tok[0]);

没有意义,因为您通过一个charchar *是预期的。

要么做

        printf("%sn", tok);

        printf("%cn", tok[0]);

还有这条线

  char*images = (char*)malloc(100);

创建内存泄漏,因为对分配给images的内存的引用在离开上下文时丢失images声明在上下文中而没有对其进行free()编辑。


还^2 :

在C语言中,不需要强制转换malloc/calloc/realloc的结果,也不建议这样做。

所以上面的行应该更好:

char * images = malloc(100);

另外^3:始终检查系统调用的结果,至少如果代码依赖于返回的值。这里:检查fopen()是否失败,如返回错误NULL,如果用作有效的文件指针,这将使程序阻塞。


作为有关如何查找错误的一般建议:使用符号(gcc 的选项 -g)编译有问题的代码,然后使用调试器作为 gcc 逐步完成"运行"代码。

  1. 您应该检查 fopen() 的返回值,正如其他人已经指出的那样。

  2. 如果要打印字符串,printf("%sn",tok[0]);应该是printf("%sn",tok);的。

  3. 更严重的是,

        while(tok!=NULL)
        {
            strcat(images,tok);
        }
        tok = strtok(NULL,quote);
    

    tok = strtok(...);应放在该while循环中,否则tok将永远不会更改,并且程序最终将崩溃。

相关内容

  • 没有找到相关文章

最新更新