0
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include <sys/types.h> 
#include <sys/stat.h>
#include <unistd.h>
#include<string.h>
#include <fcntl.h>

void match_pattern(char *argv[])
{
    int fd,r,j=0;
    char temp,line[100];
    if((fd=open(argv[2],O_RDONLY)) != -1)
    {
        while((r=read(fd,&temp,sizeof(char)))!= 0)
        {
            if(temp!='\n')
            {
                line[j]=temp;
                j++;
            }
            else
            {
                if(strstr(line,argv[1])!=NULL)
                    printf("%s\n",line);
                memset(line,0,sizeof(line));
                j=0;
            }

        }
    }   
}

main(int argc,char *argv[])
{
    struct stat stt;
    if(argc==3)
    {
        if(stat(argv[2],&stt)==0)
            match_pattern(argv);
        else 
        {
            perror("stat()");
            exit(1);
        }
    }
}

ファイルの内容:

arunds ghh
sdf
hi
hello dude
am arun

私の出力:

./mygrep arun file
arunds ghh
am arun

正しい出力を得ています

ファイルの内容:

arun arundfdf arun
arunds ghh
sdf

私の出力:

./mygrep arun file
arun arundfdf arun �5
arunds ghh

不要な文字が印刷される理由がわかりません。

4

2 に答える 2

2

lineバッファーをNULL で終了することはないため、終了後にオーバーフローします。変数memsetを宣言した後も呼び出しを実行します。line

于 2013-02-05T15:13:24.450 に答える
0

null で終了する必要がありますlineが、一度に 1 文字ずつ読み取るのはなぜですか? fgets()バッファをnullで終了する行全体を読み取ることができます:

while (fgets(line, sizeof(line), file)) {
   if (strstr(line, argv[1])) {
    ...
   }
}

また、これにより、割り当てた 100 バイトのバッファがオーバーフローしないようになります。

于 2013-02-05T15:19:43.790 に答える